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

編集:私は(ズーバが言ったように)送信されたホットキーを「復号化」する方法を見つけました。ここに解決策があります:

    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メッセージを生成するために上位ワードによって指定されたキーと組み合わせて押されるキーを指定します。この単語は、次の1つ以上の値にすることができます。上位ワードは、ホットキーの仮想キーコードを指定します。

したがって、のLParamメンバーを読み取って、押されたキーを判別できます(または、チェックできるmよりも多くの適切な識別子を割り当てた場合)。GetHashCodeWParam

IntPtr「上位ワード」と「下位ワード」は、に含まれる整数の部分(実際には)を参照するためLParam、これらを抽出する必要があります。下位の単語はですが i & 0xFFFF、上位の単語は(i >> 16) & 0xFFFFです。

押されたキーの組み合わせを検出するには、下位ワードの下位4ビットで修飾子(shift、alt、control)を確認し、上位ワードを仮想キーコード(文字の場合は文字と同じ)と比較します。大文字の値(たとえば、Aの仮想キーコードは(int)'A'ですが、(int)'a'ではありません)。

WM_HOTKEYホットキーは単一の文字のみをサポートするため、「A + B + C+D」の組み合わせは無効です。どこからでもその組み合わせを検出するには、キーボードフックを取り付ける必要があります(または、アプリケーションがアクティブなときにのみ検出したい場合は、メッセージを処理します)。

于 2011-01-20T20:37:02.850 に答える
0

私は答えを見つけました。を使用する代わりに、使用したところregisterhotkeyKeyStateすべての問題が解決しました。興味のある方は、こちら( archive.org のバックアップ)にアクセスしてください。

于 2011-01-23T15:07:27.437 に答える