2017-05-19 68 views
2

我遇到了一个烦人的问题。当鼠标指针位于我的主窗口上并显示拥有弹出窗口(请参阅下面的示例)或不可见时,即使鼠标未移动,每次都会生成一个WM_MOUSEMOVE消息。由于几个原因,在我的情况下是不能容忍的。弹出窗口显示/隐藏后防止生成WM_MOUSEMOVE

hWnd = CreateWindowEx(0, wcx.lpszClassName, L"Demo", WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, nullptr, 0, hInstance, nullptr); 
    HWND hWndPopupTest = CreateWindowEx(WS_EX_NOACTIVATE | WS_EX_TOPMOST, L"Static", L"DemoPopup", WS_POPUP | WS_VISIBLE, 10, 10, 100, 100, hWnd, 0, hInstance, nullptr); 
    ShowWindow(hWnd, SW_SHOW); 
    ShowWindow(hWndPopup, SW_SHOWNOACTIVATE); 
    Sleep(1000); 
    ShowWindow(hWndPopup, SW_HIDE); 

调用ReleaseCapture时会发生同样的情况。这是可以禁用的功能吗?这是一个已知的“问题”还是有解决方法?

编辑:肮脏的解决方法

在如果从去年WM_MOUSEMOVE鼠标的位置已经改变(主)窗口过程,我们可以测试。如果位置没有改变,那一定是因为一个弹出窗口被显示/隐藏或者一些窗口捕获被释放。

+2

它不能被禁用。实际上重要的是,它确保光标形状是正确的。你必须解决它。 –

+0

这种行为记录在某个地方吗? – bkausbk

+1

[为什么我得到虚假的WM_MOUSEMOVE消息?](https://blogs.msdn.microsoft.com/oldnewthing/20031001-00/?p=42343),[当然,我可以得到虚假的WM_MOUSEMOVE消息,但为什么他们(https://blogs.msdn.microsoft.com/oldnewthing/20090617-00/?p=17863),以及[为什么每当Resource Manager运行时都会收到虚假的WM_MOUSEMOVE消息?](https: //blogs.msdn.microsoft.com/oldnewthing/20160616-00/?p=93685)。 – IInspectable

回答

0

根据此处提供的信息(谢谢@IInspectable),我的一般解决方案是通过使用GetMouseMovePointsEx查看鼠标位置历史记录来检测给定点是否为真实点。如果找不到点,则表示没有发生有效的移动。

POINT CurrentPoint{GET_X_LPARAM(lParam), GET_Y_LPARAM(lParam)}; 
    MapWindowPoints(hWnd, nullptr, &CurrentPoint, 1); 
    MOUSEMOVEPOINT mmpi = { 
     CurrentPoint.x, CurrentPoint.y, GetTickCount(), 0 
    }; 
    MOUSEMOVEPOINT mmpo = {0}; 
    if (GetMouseMovePointsEx(sizeof(mmpi), &mmpi, &mmpo, 1, GMMP_USE_DISPLAY_POINTS) > 0) { 
     MyInstance->HandleMouseMove(POINT{GET_X_LPARAM(lParam), GET_Y_LPARAM(lParam)}, wParam); 
    } else { 
     // No mouse point found in history, so couldn't be a valid point 
    }