3

如果在任何地方按下一个键,我试图让我的程序激活它的任务,即使它不在焦点上。(让我们在这个例子中只使用 F1,并将标签上的文本设置为“Hello World”)。

我查看了关键侦听器、钩子等,并且在试图了解正在发生的事情时感到头疼。有什么简单的方法可以完成这项工作。

4

3 回答 3

7

您可以使用 WIN API RegisterHotKey函数。

[DllImport("user32")]
public static extern int RegisterHotKey(IntPtr hwnd, int id, int fsModifiers, int vk);

在 Form_Load 事件上注册热键:

private void Form_Load(object sender, EventArgs e)
{
    RegisterHotKey(Handle, 42, 0, (int)Keys.F1);
}

请记住,如果您想挂钩某些键组合,而不是零,您应该传递以下值之一(对于 Alt、Ctrl、Shift 或 Windows 键):

private const int MOD_ALT = 0x1;
private const int MOD_CONTROL = 0x2;
private const int MOD_SHIFT = 0x4;
private const int MOD_WIN = 0x8;

此时,当您按下某处 F1 键时,系统将向您的窗口发送WM_HOTKEY 消息。在 WndProc 中处理它:

private const int WM_HOTKEY = 0x312;

protected override void WndProc(ref Message m)
{
    base.WndProc(ref m);

    if (m.Msg == WM_HOTKEY)
    {
        if (!Visible)
            Visible = true;
        Activate();
        Keys vk = (Keys)(((int)m.LParam >> 16) & 0xFFFF);
        int fsModifiers = ((int)m.LParam & 0xFFFF);

        if (vk == Keys.F1 && sModifiers == 0)
            label.Text = "Hello World";
    }
}

顺便说一句,关闭表单时不要忘记取消注册热键。

于 2012-07-13T20:06:23.770 回答
2

这里的这篇文章,你需要的是全局热键。我提供的链接将其封装成一个非常有用的形式。

于 2012-07-13T19:47:04.413 回答
2

您是否查看过Win32 RegisterHotKey 功能?如果您想在另一个应用程序处于前台时获得键盘输入,这可能是您最好的选择。您需要 pinvoke 或找到托管包装器。

于 2012-07-13T19:48:10.740 回答