C# 使用全局热键:获取实际按下的键

C# 使用全局热键:获取实际按下的键,c#,.net,hotkeys,C#,.net,Hotkeys,在我的表格中,我注册了不同的热键。稍后在执行过程中,我想知道实际按下了哪个热键。我从哪里可以得到这些信息 在初始化期间注册: public Form1() { this.KeyPreview = true; ghk = new KeyHandler(Keys.F1, this); ghk.Register(); ghk = new KeyHandler(Keys.F2, this); ghk.Register(); InitializeComponent();

在我的
表格中
,我注册了不同的热键。稍后在执行过程中,我想知道实际按下了哪个热键。我从哪里可以得到这些信息

在初始化期间注册:

public Form1()
{
   this.KeyPreview = true;
   ghk = new KeyHandler(Keys.F1, this);
   ghk.Register();
   ghk = new KeyHandler(Keys.F2, this);
   ghk.Register();
   InitializeComponent();
}
使用此KeyHandler类:

public class KeyHandler
{
    [DllImport("user32.dll")]
    private static extern bool RegisterHotKey(IntPtr hWnd, int id, int fsModifiers, int vk);

    [DllImport("user32.dll")]
    private static extern bool UnregisterHotKey(IntPtr hWnd, int id);

    private int key;
    private IntPtr hWnd;
    private int id;

    public KeyHandler(Keys key, Form form)
    {
        this.key = (int)key;
        this.hWnd = form.Handle;
        id = this.GetHashCode();
    }

    public override int GetHashCode()
    {
        return key ^ hWnd.ToInt32();
    }

    public bool Register()
    {
        return RegisterHotKey(hWnd, id, 0, key);
    }

    public bool Unregister()
    {
        return UnregisterHotKey(hWnd, id);
    }
}
触发的方法:

protected override void WndProc(ref Message m)
{
   if (m.Msg == Constants.WmHotkeyMsgId)
   HandleHotkey(m);
   base.WndProc(ref m);
}
这里我想区分两个热键:

private void HandleHotkey(Message m)
{
   if(key == F1)
      DoSomething
   if(key == F2)
      DoSomethingElse
}

您应该能够通过使用id知道实际的密钥。注册热键时,您使用id、密钥和修改器。按下热键时,Windows会在回调中为您提供热键的id,而不是键和修饰符

RegisterHotKey(句柄,id:1,ModifierKeys.Control,Keys.A);
RegisterHotKey(句柄,id:2,ModifierKeys.Control | ModifierKeys.Alt,Keys.B);
const int WmHotKey=786;
如果(msg.message!=WmHotKey)
返回;
var id=(int)msg.wParam;
如果(id==1)//Ctrl+A
{
}
如果(id==2)//Ctrl+Alt+B,则为else
{
}
下面是我写的一篇博客文章,其中包含为WPF应用程序注册热键的代码: