通过以下RegisterHotKey
函数,我可以全局挂钩正常的键修饰符组合:
[DllImport("user32.dll")]
private static extern bool RegisterHotKey(IntPtr hWnd, int id, uint fsModifiers, uint vk);
Run Code Online (Sandbox Code Playgroud)
关于它的精彩文章和完整的源代码在这里:http://www.liensberger.it/web/blog/ ?p=207
但问题是,如何挂钩媒体键,即键盘和电脑遥控器中的播放/暂停/下一个/上一个键?我用谷歌搜索了又搜索,但没有任何运气。
目前,我在使全局 keyhook 在 Windows 7 64 位操作系统上运行时遇到一些麻烦。现在我知道 Stackoverflow 上已经有很多关于这个主题的帖子,但没有一个能给我一个可以使用的答案,或者我不太明白这些帖子中的问题是如何解决的。
因此,我将尝试解释我所遇到的困难,并希望任何人都可以帮助我或为我指明正确的方向。
基本上我的目标是拦截 CTRL+C 和 CTRL+V 键盘输入以实现某种剪贴板管理器。因此,我当前的尝试是注册一个系统范围的WH_KEYBOARD
挂钩,根据我的需要处理截获的击键。
我在 64 位 Windows 7 操作系统上运行钩子,这就是问题开始的地方。对我来说很明显,32 位 Hook DLL 会给 64 位进程带来问题,反之亦然。因此,我生成了包含该钩子的库的 x86 和 x64 版本,以及该钩子的调用者(调用 的那个SetWindowsHookEx()
),两者都具有不同的文件名,如文档所示。
但现在怎么办?如果我将 64 位 DLL 设置为系统范围的挂钩,则所有 32 位应用程序在聚焦时按下某个键后就会开始挂起。同样的事情,当我应用 32 位挂钩时,我的 Windows 几乎无法使用,因为它explorer.exe
是 64 位的。如果我设置了两个钩子,我的系统就会有效地处于停滞状态,进行全局“bitness”战斗。
现在我假设问题是由 64 位挂钩 DLL 试图注入 32 位进程等引起的,这当然是无意义的。但对于这种情况,文档SetWindowsHookEx()
说明如下:
由于挂钩在应用程序的上下文中运行,因此它们必须与应用程序的“位数”匹配。如果 32 位应用程序在 64 位 Windows 上安装全局挂钩,则该 32 位挂钩将被注入到每个 32 位进程中(适用通常的安全边界)。在 64 位进程中,线程仍标记为“挂钩”。但是,由于 32 位应用程序必须运行挂钩代码,因此系统会在挂钩应用程序的上下文中执行挂钩;具体来说,在调用 SetWindowsHookEx 的线程上。这意味着挂钩应用程序必须继续发送消息,否则可能会阻止 …