如何捕捉键盘和鼠标事件?

Posted

技术标签:

【中文标题】如何捕捉键盘和鼠标事件?【英文标题】:How to catch Keyboard and mouse events? 【发布时间】:2010-04-18 23:16:28 【问题描述】:

我想创建一个应用程序。当用户按下键盘上的特殊键或/并使用滚轮时,此应用程序必须执行某些操作。此应用程序是一项服务。它没有窗户。我想捕捉使用其他应用程序设计的任何键盘或鼠标事件。

例如,您正在通过 3rd 方应用程序观看电视。如果您按Ctrl + Shift 并使用滚轮,我的应用程序会更改音量。

我使用 Windows 7 x64 和 Visual Studio 2008。

【问题讨论】:

【参考方案1】:

当各种事件发生时,您可以拨打SetWindowsHookEx() 得到通知。您可能希望使用键盘钩子和鼠标钩子来监视鼠标事件。

【讨论】:

不清楚。我打电话给hhk=::SetWindowsHookEx(WH_KEYBOARD_LL, LowLevelKeyboardProc1, 0, 0);。但这不起作用。你能给我更多的信息吗? 使用普通的键盘挂钩和鼠标挂钩可能会更好。低级键盘钩子可能被调用得太早 - 我不确定它是否会给你你需要的信息。似乎有一个从 MSDN 页面链接的示例 - 也许这会有所帮助? 请注意,_LL 挂钩要求您有一个 GetMessage()/DispatchMessage() 循环,即使您没有任何可见窗口;如果你只是 Sleep() 或 Wait...(),那么它就行不通了。由于您使用的是 x64,请注意 _LL 挂钩适用于 32 位和 64 位应用程序,但普通挂钩仅加载到具有相同位数的进程中,因此 32 位进程只会从其他进程获取事件32 位进程,64 位进程类似。【参考方案2】:

如果您的应用程序是真正的 Win32 服务,那么在 Vista 及更高版本上,应用程序将不会接收键盘或鼠标事件 - 为了关闭安全漏洞(搜索“粉碎攻击”),Microsoft 隔离了所有服务以防止它们与用户互动。

您需要让您的应用程序在与交互式登录用户的会话中运行。

【讨论】:

【参考方案3】:

可以使用RAW INPUT方式,比GetAsyncKeyState等更可靠

我在代码项目上写了this article,可能对你有用。

同时提供 C# 和 MASM 源代码版本。

【讨论】:

以上是关于如何捕捉键盘和鼠标事件?的主要内容,如果未能解决你的问题,请参考以下文章

Java JTable 添加了一个键盘事件,和鼠标点击事件的监听,如何在我键盘事件起作用时,让鼠标事件失效

如何捕捉鼠标点击事件到重叠的ItemsControl

捕捉鼠标事件

JavaFX实战:几种事件监听实现,键盘按键事件监听,鼠标滚轮事件监听,鼠标按键事件监听,鼠标移动事件监听

JavaFX实战:几种事件监听实现,键盘按键事件监听,鼠标滚轮事件监听,鼠标按键事件监听,鼠标移动事件监听

JavaFX实战:几种事件监听实现,键盘按键事件监听,鼠标滚轮事件监听,鼠标按键事件监听,鼠标移动事件监听