Почему событие MouseMove происходит после события MouseUp? - PullRequest
12 голосов
/ 11 июля 2019

В WindowsForms Я просто добавил обработчики событий следующим образом:

    private void Form1_MouseDown(object sender, MouseEventArgs e)
    {
        Debug.WriteLine($"=> Form1_MouseDown, Clicks: {e.Clicks}, Location: {e.Location}");
    }

    private void Form1_MouseUp(object sender, MouseEventArgs e)
    {
        Debug.WriteLine($"=> Form1_MouseUp, Clicks: {e.Clicks}, Location: {e.Location}");
    }

    private void Form1_MouseMove(object sender, MouseEventArgs e)
    {
        Debug.WriteLine($"=> Form1_MouseMove, Clicks: {e.Clicks}, Location: {e.Location}");
    }

И вывод:

=> Form1_MouseMove, Clicks: 0, Location: {X=17,Y=21}
=> Form1_MouseDown, Clicks: 1, Location: {X=17,Y=21}
=> Form1_MouseUp,   Clicks: 1, Location: {X=17,Y=21}
=> Form1_MouseMove, Clicks: 0, Location: {X=17,Y=21}

Вы можете видеть, что все события происходят в одном и том же месте, поэтому мой вопрос: почему после события MouseUp происходит событие MouseMove?

Также я попробовал подобный код в WPF, и MouseMove произошло событие НЕ .

И я попробовал подобный код в C ++, и MouseMove произошло событие НЕ :

LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
    switch (message)
    {
     ...

    case WM_MOUSEMOVE:
        OutputDebugString(L"WM_MOUSEMOVE\n");
        break;

    case WM_LBUTTONDOWN:
        OutputDebugString(L"WM_LBUTTONDOWN\n");
        break;

    case WM_LBUTTONUP:
        OutputDebugString(L"WM_LBUTTONUP\n");
        break;

    default:
        return DefWindowProc(hWnd, message, wParam, lParam);
    }
    return 0;
}

Ответы [ 3 ]

8 голосов
/ 16 июля 2019

Если ваша мышь ранее была сфокусирована на отдельном окне, то нажатие на новое окно и смещение фокуса мыши создаст событие перемещения мыши (даже если мышь не двигалась сразу до или после того, как вы щелкнули мышью). мышь).

Вот ссылка на похожий ответ StackOverflow Событие "Призрак" MouseMove

5 голосов
/ 22 июля 2019

Это потому, что захват мыши с помощью MouseDown освобождается на MouseUp.И этот дополнительный MouseMove может быть для обеспечения положения курсора.В качестве обходного пути вы можете сделать это

        Point LastLocation = Point.Empty;

        private void Form1_MouseDown(object sender, MouseEventArgs e)
        {
            Debug.WriteLine("=> Form1_MouseDown, Clicks: " + e.Location + ", Location: " + e.Location + "");
        }

        private void Form1_MouseUp(object sender, MouseEventArgs e)
        {
            Debug.WriteLine("=> Form1_MouseUp, Clicks: " + e.Location + ", Location: " + e.Location + "");

        }

        private void Form1_MouseMove(object sender, MouseEventArgs e)
        {
            if (LastLocation != e.Location)
            {
                LastLocation = e.Location;
                Debug.WriteLine("=> Form1_MouseMove, Clicks: " + e.Location + ", Location: " + e.Location + "");
            }
        }
1 голос
/ 23 июля 2019

Это предполагаемое поведение, которое также будет запускаться при каждом переключении приложения (например, Alt + Tab).

Вы должны использовать обходной путь, предложенный обходным решением @ VishnuBabu. И чтобы игнорировать начальный триггер перемещения мыши, вы можете получить текущую позицию курсора после загрузки окна вместо того, чтобы установить для LastLocation значение Empty.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...