我被困。

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

    [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所说的那样)如何“解密”哪个Hotkey被发送,这是解决方案:

    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);
    }
有帮助吗?

解决方案 2

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

其他提示

从文档 wm_hotkey:

lparam 低阶单词指定要与高阶Word指定的密钥一起按下的键,以生成WM_HOTKEY消息。这个词可以是以下值之一。高阶单词指定热键的虚拟密钥代码。

因此,您可以阅读 LParam 成员 m 要确定按下的键(或者,如果您分配了比较明智的标识符 GetHashCode 您可以检查 WParam).

“高阶单词”和“低序单词”是指整数的一部分(实际上是一个 IntPtr)包含 LParam, ,因此您需要提取这些内容。低阶的单词是 i & 0xFFFF, ,而高阶单词是 (i >> 16) & 0xFFFF.

要检测按下哪个关键组合,请检查修饰符(Shift,Alt,Control)的低阶单词的最低四位,并将高阶单词与虚拟键代码进行比较 - 对于字母,该字母等于字符资本的价值(例如,A IS(int)'a'的虚拟密钥代码,而不是(int)'a')。

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

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top