如何使用 c++ mfc 在屏幕上获取鼠标事件

How to get mouse events on screen with c++ mfc

本文关键字:获取 鼠标 事件 屏幕 何使用 c++ mfc      更新时间:2023-10-16

everyone. 现在,我正在使用 c++ mfc 开发桌面窗口应用程序。 我想在桌面背景上获取鼠标移动向下事件。 为什么我想要这些,这个应用程序需要所有窗口移动调整大小事件,以及鼠标位置。 经过这么多的谷歌搜索,我不会搜索正确的解决方案。 有人建议全局鼠标钩子很有帮助,但我真的不知道如何使用它。 你对此有何看法? 请帮助我找到正确的解决方案。

此致敬意 隼

您正在寻找 Windows 低级全局输入挂钩 APISetWindowsHookEx

您可以在此处找到更多信息:https://msdn.microsoft.com/en-us/library/windows/desktop/ms644990(v=vs.85(.aspx

具体来说,您希望使用"低级"鼠标钩子,如下所示:

HHOOK mousehook = SetWindowsHookEx(WH_MOUSE_LL, MouseHookProc, NULL, 0);

您需要根据此链接将其与 Windows 消息队列一起使用:

为什么 SetWindowsHookEx 必须与 Windows 消息队列一起使用

低级钩子、WH_KEYBOARD_LL和WH_MOUSE_LL与所有其他钩子不同。它们不需要将 DLL 注入到目标进程中。相反,Windows 会在您自己的进程中直接调用您的挂钩回调。要实现这一点,需要一个消息循环。Windows没有其他机制可以在主线程上进行回调,回调只能在您调用Get/PeekMessage((以便Windows受控时发生。

像WH_KEYBOARD这样的全局钩子是非常不同的。它需要一个 DLL,回调发生在处理键盘消息的进程中。你需要某种进程间通信来让你自己的程序意识到这一点。命名管道是通常的选择。否则当然需要这个注入的进程泵送一个消息循环。否则它不会收到键盘消息。

偏爱低级钩子,它们更容易上手。但是要抽水,否则它不起作用。并且要注意超时,如果您的响应速度不够,那么Windows将在不通知的情况下杀死您的钩子。