Winapi 显示/隐藏弹出窗口后防止生成WM_MOUSEMOVE

Winapi 显示/隐藏弹出窗口后防止生成WM_MOUSEMOVE,winapi,mouseevent,popupwindow,user32,hwnd,Winapi,Mouseevent,Popupwindow,User32,Hwnd,我遇到了一个恼人的问题。当鼠标指针定位在我的主窗口上,并且显示所属的弹出窗口(参见下面的示例)或使其不可见时,即使未移动鼠标,每次都会生成WM\u MOUSEMOVE消息。出于几个原因,我不能容忍这种情况 hWnd = CreateWindowEx(0, wcx.lpszClassName, L"Demo", WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, nullptr,

我遇到了一个恼人的问题。当鼠标指针定位在我的主窗口上,并且显示所属的弹出窗口(参见下面的示例)或使其不可见时,即使未移动鼠标,每次都会生成
WM\u 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
以来鼠标位置是否发生了变化。如果位置没有改变,那一定是因为显示/隐藏了弹出窗口或发布了某个窗口捕获。

根据此处提供的信息(谢谢@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
    }

它不能被禁用。实际上很重要,它可以确保光标形状正确。你必须解决这个问题。这种行为是否有记录在案?以及。