【问题标题】:WM_MOUSEMOVE message handlingWM_MOUSEMOVE 消息处理
【发布时间】:2012-07-21 22:44:03
【问题描述】:

我有以下WndProc

LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM w, LPARAM l)
{
    switch (message)
    {
    case WM_DESTROY:
        PostQuitMessage(0);
        return 0;
    case WM_MOUSEMOVE:
            return 0;
    default:
        return DefWindowProc(hWnd, message, w, l);
    }
}

我想阻止鼠标移动,所以我试图丢弃移动消息。问题是鼠标仍在移动。我也试过WM_NCHITTESTWM_MOUSEHOVER

【问题讨论】:

  • 你需要一个钩子:SetWindowsHookEx
  • 我找到了一个旧的 C++ 并对其进行了一些更改。当我在 C++ 中编译它时它起作用了,只是导致鼠标在程序结束之前无法使用:pastebin.com/GyANfGtZ。这不是你能做的最好的,但它会让你开始。使用时要小心。
  • 我想有一种更骇人听闻的方法是,如果它只是在玩,就向SetCursorPos 发送垃圾邮件。我从不建议在实际代码中做任何类似的事情。
  • @chris 发布的钩子代码是完全错误的,以至于作为一个例子完全没用。对于初学者,正如LowLevelMouseProc callback function 的文档所指出的,钩子过程必须 调用CallNextHookEx function。笼统地说,请重新考虑使用全局解决方案来解决本地问题。
  • @CodyGray,我的示例的重点是完全禁用鼠标。这涉及不传递事件。 It may return a nonzero value to prevent the system from passing the message to the rest of the hook chain or the target window procedure. 第二部分绝对是一个好点,不过记得ClipCursor。我的想法更多的是“玩得开心”模式而不是“分发程序”模式。

标签: c winapi wndproc


【解决方案1】:

WM_MOUSEMOVE 消息只是窗口管理器告诉您鼠标已移动,如果您的应用程序想要使用该信息执行某些操作,它可以这样做。它不是一种可以拦截鼠标移动并随意取消它们的机制。

【讨论】:

    【解决方案2】:

    如果您试图限制光标移动,请查看 Windows API 中的 ClipCursor 函数。

    【讨论】:

    • ClipCursor 听起来正是他想要的。不过,请确保您通过再次调用ClipCursor释放光标以将控制权交给其他应用程序。完全接管用户的计算机并阻止他们使用其他应用程序是对用户不利的体验,保证会立即卸载您的应用程序(如果他们知道如何打开控制面板)。
    • 哦,哇,我完全忘记了这个功能。人类记忆失败。
    猜你喜欢
    • 2014-10-11
    • 1970-01-01
    • 1970-01-01
    • 2012-02-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多