2017-05-19 40 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 
    }