如何捕捉键盘和鼠标事件?
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 添加了一个键盘事件,和鼠标点击事件的监听,如何在我键盘事件起作用时,让鼠标事件失效
JavaFX实战:几种事件监听实现,键盘按键事件监听,鼠标滚轮事件监听,鼠标按键事件监听,鼠标移动事件监听