找不到任何关于WM_MOUSEFIRST的文档。

问题描述 投票:0回答:1

我有一个自定义的WndProc,它应该根据ImGui菜单是否打开来处理输入。

if (Menu::isOpen) {
    ImGui_ImplWin32_WndProcHandler(hWnd, msg, wParam, lParam);
    if    (msg == WM_LBUTTONDOWN
        || msg == WM_LBUTTONUP
        || msg == WM_LBUTTONDBLCLK

        || msg == WM_MBUTTONDOWN
        || msg == WM_MBUTTONUP
        || msg == WM_MBUTTONDBLCLK

        || msg == WM_RBUTTONDOWN
        || msg == WM_RBUTTONUP
        || msg == WM_RBUTTONDBLCLK

        || msg == WM_XBUTTONDOWN
        || msg == WM_XBUTTONUP
        || msg == WM_XBUTTONDBLCLK
        || msg == WM_MOUSEFIRST) return 0;
}
return CallWindowProc((WNDPROC)Get().m_ulOldWndProc, hWnd, msg, wParam, lParam);

我的目标是防止只有在ImGui打开的情况下鼠标点击才会进入后台。我注意到,如果我不阻止WM_MOUSEFIRST通过,一些点击仍然偶尔会在应用程序中注册。我还注意到,当我阻止WM_MOUSEFIRST通过时,悬停在应用程序中的东西上不能工作,我希望这样做。我想我可以通过检查wParams或lParams中的一些东西来解决这个问题,但我找不到任何关于WM_MOUSEFIRST的文档。

windows winapi events mouseevent message-queue
1个回答
5
投票

WM_MOUSEFIRST 而如果(msg == ...); 如果(msg == ...) WM_MOUSELAST 并不是信息标识符,而是用来表达一系列与鼠标相关的信息的符号常量。它们是用来表达与鼠标相关的信息范围的符号常数。它们只用于确定任何给定的消息是否在这个特定的范围内,例如

bool is_mouse_msg(uint32_t msg)
{
    return (msg >= WM_MOUSEFIRST) && (msg <= WM_MOUSELAST);
}

你会发现类似的 WM_XXXFIRSTWM_XXXLAST 对许多其他消息类型,如 WM_KEYFIRSTWM_KEYLAST, WM_TABLET_FIRSTWM_TABLET_LAST,等等。


0
投票

砸了我的鼠标后,我发现只有当鼠标移动时,点击才会注册。这是因为应用程序检查WM_MOUSEMOVE(与WM_MOUSEFIRST相同)是否设置了wParam MK_LBUTTON。我简单地添加了。|| ((msg == WM_MOUSEMOVE) && (wParam != 0))

© www.soinside.com 2019 - 2024. All rights reserved.