在 WM_MOUSEFIRST 上找不到任何文档
Can't find any documentation on WM_MOUSEFIRST
我有我的自定义 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
的任何文档
WM_MOUSEFIRST
和 WM_MOUSELAST
不是消息标识符。它们是用于表达一系列与鼠标相关的消息的符号常量。它们仅用于确定任何给定消息是否落在该特定范围内,例如
bool is_mouse_msg(uint32_t msg)
{
return (msg >= WM_MOUSEFIRST) && (msg <= WM_MOUSELAST);
}
对于许多其他消息类型,您会发现类似的 WM_XXXFIRST
/WM_XXXLAST
对,例如 WM_KEYFIRST
/WM_KEYLAST
、WM_TABLET_FIRST
/WM_TABLET_LAST
,等等
砸了我的鼠标后,我发现点击只有在鼠标移动时才会记录。这是因为应用程序检查 WM_MOUSEMOVE(与 WM_MOUSEFIRST 相同)是否设置了 wParam MK_LBUTTON。我简单补充了一句。 || ((msg == WM_MOUSEMOVE) && (wParam != 0))
我有我的自定义 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
的任何文档WM_MOUSEFIRST
和 WM_MOUSELAST
不是消息标识符。它们是用于表达一系列与鼠标相关的消息的符号常量。它们仅用于确定任何给定消息是否落在该特定范围内,例如
bool is_mouse_msg(uint32_t msg)
{
return (msg >= WM_MOUSEFIRST) && (msg <= WM_MOUSELAST);
}
对于许多其他消息类型,您会发现类似的 WM_XXXFIRST
/WM_XXXLAST
对,例如 WM_KEYFIRST
/WM_KEYLAST
、WM_TABLET_FIRST
/WM_TABLET_LAST
,等等
砸了我的鼠标后,我发现点击只有在鼠标移动时才会记录。这是因为应用程序检查 WM_MOUSEMOVE(与 WM_MOUSEFIRST 相同)是否设置了 wParam MK_LBUTTON。我简单补充了一句。 || ((msg == WM_MOUSEMOVE) && (wParam != 0))