在.NET中注册热键 – 三/四键的组合

我被困。

现在,我使用以下代码来收听热键:

[DllImport("user32.dll")] public static extern bool RegisterHotKey(IntPtr hWnd, int id, int fsModifiers, int vlc); [DllImport("user32.dll")] public static extern bool UnregisterHotKey(IntPtr hWnd, int id); protected override void WndProc(ref Message m) { if (m.Msg == 0x0312) { // whatever i need } base.WndProc(ref m); } 

和这个注册热键的function:

 Form1.RegisterHotKey(this.Handle, this.GetType().GetHashCode(), 0, (int)chr); 

它完美地运作。 我的问题是如何将多个热键注册为相同的组合,例如:

  1. A + B + C + d
  2. ALT + SHIFT + B
  3. CTRL + ALT + SHIFT + X

编辑:我发现(如Zooba所说)如何“解密”发送了哪个热键,这是解决方案:

  protected override void WndProc(ref Message m) { if (m.Msg == 0x0312) { Keys key = (Keys)(((int)m.LParam >> 16) & 0xFFFF); ModifierKeys modifier = (ModifierKeys)((int)m.LParam & 0xFFFF); if ((modifier + "+" + key == "Alt+S")) { //do what ever I need. } } base.WndProc(ref m); } 

从WM_HOTKEY的文档:

lParam低位字指定要与高位字指定的键组合按下的键以生成WM_HOTKEY消息。 该单词可以是以下一个或多个值。 高位字指定热键的虚拟键码。

因此,您可以读取mLParam成员以确定按下的键(或者,如果您指定比GetHashCode更合理的标识符,则可以检查WParam )。

“高位字”和“低位字”是指IntPtr包含的整数部分(实际上是IntPtr ),因此您需要提取这些部分。 低位字是i & 0xFFFF ,而高位字是(i >> 16) & 0xFFFF

要检测按下哪个组合键,请检查修改器(shift,alt,control)的低位字的最低四位,并将高位字与虚拟键代码进行比较 – 对于字母等于字符资本的价值(例如,A的虚拟密钥代码是(int)’A’,但不是(int)’a’)。

您的“A + B + C + D”组合无效,因为WM_HOTKEY热键仅支持单个字符。 您需要附加一个键盘钩子以从任何地方检测该组合(或者如果您只想在应用程序处于活动状态时检测它,则处理消息)。

我找到了答案。 我没有使用registerhotkey ,而是使用了KeyState ,它解决了我所有的问题。 如果有人有兴趣,你可以去这里 ( 在archive.org上备份 )