WM_MOUSEWEEL停止工作,而WinAPI(C++)中的其他事件仍在工作

WM_MOUSEWHEEL stops working while other events still works on in WinAPI (C++)

本文关键字:其他 事件 工作 C++ 停止工作 MOUSEWEEL WinAPI WM      更新时间:2023-10-16

我的c++WinAPI应用程序中出现了一个奇怪的问题。

当我运行我的应用程序时,滚动会工作,每次使用它时我都会看到MessageBox。但是,然后,我点击这里和那里,改变窗口,回到我的。。。一切正常,除了鼠标滚动(程序不会接收消息,也不会出现MessageBox,而例如LBM、RBM和按键工作得很好,程序会对它们做出反应)。

这可能是由于我在程序中执行的SetCapture/ReleaseCapture如果不是,那么除了鼠标滚动(从一开始就有效)之外,是什么原因导致了这种奇怪的行为

我有典型的循环:

while(GetMessage (&msg, NULL, 0, 0) > 0){
     TranslateMessage(&msg);
     DispatchMessage(&msg);
}

我的事件处理程序:

LRESULT CALLBACK WndProc( HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam ){
switch(message){
    case WM_MOUSEMOVE:
        {   
            //fun stuff here
        }
        break;
    case WM_MOUSEWHEEL:
        {
            MessageBox(NULL, L"MouseWheel", L"MouseWheel", NULL);
            //even more fun stuff here
        }
        break;
    case WM_CREATE:
        {   
        }
        break;
    case WM_CTLCOLORSTATIC:
        {
            //...
            return (LRESULT)GetStockObject(NULL_BRUSH);
        }
        break;
    case WM_PAINT:
        engine->render();
        break;
    case WM_DESTROY:
                PostQuitMessage(0);
        break;
    case WM_LBUTTONDOWN:
        {
            //fun stuff
        }
        break;
    case WM_LBUTTONUP:
        {
            //fun stuff
        }
        break;
    case WM_CHAR:
        switch(wParam){
            //...
        }
        break;
    case WM_SETCURSOR:
        view->refreshCursor();
        break;
    case WM_KEYDOWN:
        switch (wParam){
            /...
        }
        break;
    default:
        return DefWindowProc(hWnd, message, wParam, lParam);
}
return 0;
}

也许是因为我的窗口没有激活?LMB将发挥作用,因为它也将使其活跃。但是当我的窗口不活动时,悬停(用鼠标移动完成)仍然有效。如何在窗口不活动的情况下捕捉鼠标滚轮?

当鼠标滚轮旋转时发送到焦点窗口。

http://msdn.microsoft.com/en-us/library/windows/desktop/ms645617(v=vs.85).aspx