【问题标题】:Can't find any documentation on WM_MOUSEFIRST在 WM_MOUSEFIRST 上找不到任何文档
【发布时间】: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


【解决方案1】:

WM_MOUSEFIRSTWM_MOUSELAST 不是消息标识符。它们是用于表达一系列与鼠标相关的消息的符号常量。它们仅用于确定任何给定消息是否属于该特定范围,例如

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

对于许多其他消息类型,您会发现类似的 WM_XXXFIRST/WM_XXXLAST 对,例如 WM_KEYFIRST/WM_KEYLASTWM_TABLET_FIRST/WM_TABLET_LAST 等。

【讨论】:

  • 谢谢,虽然我的问题似乎出在 WM_MOUSEMOVE 中,与 WM_MOUSEFIRST 的编号相同
【解决方案2】:

砸我的鼠标后,我发现只有在鼠标移动时才会记录点击。这是因为应用程序检查了 WM_MOUSEMOVE(与 WM_MOUSEFIRST 相同)是否设置了 wParam MK_LBUTTON。我简单地补充了一句。 || ((msg == WM_MOUSEMOVE) &amp;&amp; (wParam != 0))

【讨论】:

    猜你喜欢
    • 2019-02-14
    • 1970-01-01
    • 1970-01-01
    • 2023-03-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-10-09
    • 2014-02-04
    相关资源
    最近更新 更多