在按键上激活一个未聚焦的C#程序(例如,F1将标签设置为"Hello World")

Tao*_*aoh 3 c# key listener

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

我查看了关键的监听器,挂钩等,并且正在努力了解正在发生的事情.有没有简单的方法来完成这项工作.

Ser*_*kiy 7

您可以使用WIN API RegisterHotKey函数.

[DllImport("user32")]
public static extern int RegisterHotKey(IntPtr hwnd, int id, int fsModifiers, int vk);
Run Code Online (Sandbox Code Playgroud)

在Form_Load事件上注册热键:

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

请记住,如果要挂钩某些组合键而不是零,则应传递以下值之一(对于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;
Run Code Online (Sandbox Code Playgroud)

此时当您按某处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";
    }
}
Run Code Online (Sandbox Code Playgroud)

BTW不要忘记在关闭表单时取消注册热键.