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

3

我想创建一个应用程序。当用户按下特殊键盘或/和使用滚轮时,这个应用程序需要执行某些操作。该应用程序是一个服务,没有窗口。我希望捕获其他应用程序设计的任何键盘或鼠标事件。

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

我使用Windows 7 x64和Visual Studio 2008。

3个回答

4

您可以调用SetWindowsHookEx()函数来在发生各种事件时得到通知。您可能需要使用键盘钩子和鼠标钩子来监视鼠标事件。


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

3
如果你的应用程序是真正的Win32服务,则在Vista及更高版本上,该应用程序将不会接收键盘或鼠标事件 - 为了关闭一个安全漏洞(搜索“shatter attack”),微软隔离了所有服务以防止它们与用户交互。
您需要让您的应用程序在与交互登录的用户相同的会话中运行。

2
你可以使用原始输入方法,它比GetAsyncKeyState等更可靠。
我在Code Project上写了这篇文章,可能对你有用。
有C#和MASM源代码版本都可用。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接