Проверьте, не перемещена ли мышь (стоит на месте) c # WinForms - PullRequest
0 голосов
/ 09 марта 2019

Я хочу, чтобы button5 исчезал, если мышь не двигали в течение 3 секунд.Если мышь двигается, кнопка 1 должна появиться снова.Я использовал таймер с этим кодом:

    private void timer2_Tick(object sender, EventArgs e)
    {
        if (button5.Visible == true)
        {

            timer2.Stop();
            button2.Visible = false;
            button3.Visible = false;
            aimen_IPTV2.Visible = false;
            button5.Visible = false;
            button6.Visible = false;
            aimen_IPTV1.Visible = false;

        }
    }


    private void transpCtrl1_MouseMove(object sender, MouseEventArgs e)
    {

            button5.Visible = true;
            button6.Visible = true;
            aimen_IPTV1.Visible = true;



        }`

Это не сработало, может кто-нибудь мне помочь?

1 Ответ

0 голосов
/ 09 марта 2019

Лучше всего внедрить IMessageFilter , чтобы вы могли перехватывать движения мыши по всему приложению до того, как оно будет отправлено на каждый отдельный элемент управления (где будет перехватывать беспорядок):

public partial class Form1 : Form
{

    public Form1()
    {
        InitializeComponent();
    }

    private MyFilter mf;

    private void Form1_Load(object sender, EventArgs e)
    {
        button5.Visible = false;
        mf = new MyFilter();
        mf.MouseMoved += Mf_MouseMoved;
        mf.ThreeSecondWithoutMouseMove += Mf_ThreeSecondWithoutMouseMove;
        Application.AddMessageFilter(mf);
    }

    private void Mf_MouseMoved()
    {
        button5.Visible = true;
    }

    private void Mf_ThreeSecondWithoutMouseMove()
    {
        button5.Visible = false;
    }

    private void button5_Click(object sender, EventArgs e)
    {
        MessageBox.Show("You clicked me!");
    }
}

public class MyFilter : IMessageFilter
{

    public delegate void dlgMouseMoved();
    public delegate void dlgThreeSeconds();
    public event dlgMouseMoved MouseMoved;
    public event dlgThreeSeconds ThreeSecondWithoutMouseMove;

    private Point lastPoint;
    private const int WM_MOUSEMOVE = 0x200;
    private System.Windows.Forms.Timer tmr;

    public MyFilter()
    {
        tmr = new System.Windows.Forms.Timer();
        tmr.Enabled = false;
        tmr.Interval = (int)TimeSpan.FromSeconds(3).TotalMilliseconds;
        tmr.Tick += Tmr_Tick;
    }

    bool IMessageFilter.PreFilterMessage(ref Message m)
    {
        switch (m.Msg)
        {
            case WM_MOUSEMOVE: // you WILL get phantom WM_MOUSEMOVE messages, when the mouse has NOT moved!
                Point curPoint = Cursor.Position;
                if (!curPoint.Equals(lastPoint)) 
                {
                    lastPoint = curPoint;
                    if (MouseMoved != null)
                    {
                        MouseMoved();
                    }
                    tmr.Stop();
                    tmr.Start();
                }
                break;
        }
        return false; // handle messages normally
    }

    private void Tmr_Tick(object sender, EventArgs e)
    {
        tmr.Stop();
        if (ThreeSecondWithoutMouseMove != null)
        {
            ThreeSecondWithoutMouseMove();
        }
    }

}
...