代码之家  ›  专栏  ›  技术社区  ›  google dev

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

  •  1
  • google dev  · 技术社区  · 6 年前

    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}
    

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

    我也在WPF中尝试了类似的代码 鼠标移动 事件 不是 发生。

    我尝试了类似的C++代码 鼠标移动 事件 不是 发生:

    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;
    }
    
    0 回复  |  直到 6 年前
        1
  •  10
  •   Luke    6 年前

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

    这里有一个指向类似StackOverflow响应的链接 "Ghost" MouseMove Event

        2
  •  7
  •   Vishnu Babu    6 年前

    这是因为鼠标被 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 + "");
                }
            }
    
        3
  •  2
  •   Naveen Kumar V    6 年前

    这是预期的行为,也将触发每当应用程序被切换(如:Alt+Tab)。

    你应该按照@VishnuBabu的工作区建议去做。要忽略初始mousemove触发器,您可以 加载窗口后获取光标的当前位置 而不是将LastLocation设置为空。