标签: keyhook

C# 中媒体键的全局 keyhook

通过以下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

但问题是,如何挂钩媒体键,即键盘和电脑遥控器中的播放/暂停/下一个/上一个键?我用谷歌搜索了又搜索,但没有任何运气。

c# winforms keyhook media-keys

5
推荐指数
1
解决办法
757
查看次数

64 位 Windows 上的全局 Keyhook

目前,我在使全局 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 的线程上。这意味着挂钩应用程序必须继续发送消息,否则可能会阻止 …

c++ hook winapi keyhook

2
推荐指数
1
解决办法
5409
查看次数

标签 统计

keyhook ×2

c# ×1

c++ ×1

hook ×1

media-keys ×1

winapi ×1

winforms ×1