1

我被困。

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

    [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);
    }

和这个注册热键的功能:

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);
    }
4

2 回答 2

5

WM_HOTKEY的文档中:

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

因此,您可以读取 的LParam成员m以确定被按下的键(或者,如果您分配的标识符比GetHashCode您可以检查的更多WParam)。

'high-order word' 和 'low-order word' 指的是IntPtr包含在 中的整数部分(实际上是一个 )LParam,因此您需要提取这些部分。低位词是 i & 0xFFFF,而高位词是(i >> 16) & 0xFFFF

要检测按下了哪个组合键,请检查修饰符(shift、alt、control)的低位字的最低四位,并将高位字与虚拟键码进行比较——对于字母来说,它等于字符大写的值(例如,A 的虚拟键码是 (int)'A',而不是 (int)'a')。

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

于 2011-01-20T20:37:02.850 回答
0

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

于 2011-01-23T15:07:27.437 回答