【问题标题】:Global Low Level Keyboard Hook for Combinations用于组合的全局低级键盘挂钩
【发布时间】:2012-03-09 06:47:18
【问题描述】:

感谢this 教程,我知道如何做“全局低级键盘挂钩”

我还想监控组合键或快捷键,

我的想法是,我可以拥有一组标志,这些标志可以代表键盘按键的向上\向下状态。

仅当一个 falg 为 SET 或 1 时,按键向下,而当它为 UNSET 或 0 时,按键向上。

我可以将它用于组合键\快捷键。当一个键按下时,钩子将带我到一个函数,我将在其中处理事件。我要做的是检查是否设置了任何其他特定标志。如果是,则这意味着同时按下两个键,因此我有我的组合。

我可以使这个技巧奏效。

我正在寻找的是一个更好的选择。有吗。

【问题讨论】:

  • 正如 Cody Gray 在他的回答中指出的那样,全局钩子非常重。大多数防病毒程序会立即将您的应用标记为间谍软件,因此您必须在每次安装时手动将它们添加到 AV 程序的白名单中。

标签: c# .net winapi keyboard-shortcuts keyboard-hook


【解决方案1】:

是的,更好的选择是RegisterHotKey function

全局挂钩是一种非常繁重的方法,只应在绝对必要的情况下使用。在这种情况下,听起来不仅不需要全局挂钩,而且实际上实现起来比响应每次按下所需的键序列时自动生成的简单 WM_HOTKEY message 更复杂。

由于您使用的是 .NET,因此您需要 P/Invoke RegisterHotKey 函数。
定义如下所示:

[DllImport("user32.dll", SetLastError = true)]
static extern bool RegisterHotKey(IntPtr hWnd, int id, uint fsModifiers, uint vk);

WM_HOTKEY 消息,您可以通过覆盖表单的 WndProc method 来处理它(您在调用 RegisterHotKey 函数时指定的句柄对应于以下值:

const int WM_HOTKEY = 0x0312;

RegisterHotKey 函数的链接文档中明确提供了其他必需的值。当然,这些文档是必读的;否则你会错过重要的警告。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-08-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多