为什么在MouseUp事件之后发生MouseMove事件?

goo*_*dev 15 .net c# windows visual-c++ winforms

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}");
    }
Run Code Online (Sandbox Code Playgroud)

输出为:

=> 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}
Run Code Online (Sandbox Code Playgroud)

您可以看到所有事件都发生在同一位置,所以我的问题是为什么一个MouseMove事件接一个事件MouseUp发生?

我也尝试过类似的代码在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;
}
Run Code Online (Sandbox Code Playgroud)

小智 11

如果以前将鼠标放在单独的窗口上,则单击新窗口并移动鼠标焦点将生成鼠标移动事件(即使鼠标在单击鼠标之前或之后没有立即移动)。

这是指向类似StackOverflow响应 “ Ghost”的MouseMove事件的链接。


Vis*_*abu 7

这是因为通过捕获的鼠标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 + "");
            }
        }
Run Code Online (Sandbox Code Playgroud)