【发布时间】:2020-05-08 06:48:09
【问题描述】:
我有我的自定义 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 的任何文档
【问题讨论】:
-
所以很可能是wParam导致了点击
-
处理
WM_MOUSEMOVE不会神奇地引入鼠标点击消息。任何导致观察结果与预期结果不同的原因肯定与您对WM_MOUSEMOVE的处理无关。您的代码中可能存在错误。(WNDPROC)演员表是隐藏错误的可靠方法。 -
@IInspectable 这不是错误,而是应用程序将 WM_MOUSEMOVE 注册为点击,如果它具有 wParam MK_LBUTTON
标签: windows winapi events mouseevent message-queue