1

これは私のコードです:

void tbHotkey_KeyDown(object sender, System.Windows.Input.KeyEventArgs e)
{
    if (e.Key == Key.LeftShift || e.Key == Key.RightShift || e.Key == Key.LeftCtrl || e.Key == Key.RightCtrl || e.Key == Key.LeftAlt || e.Key == Key.RightAlt || e.Key == Key.LWin || e.Key == Key.RWin)
    {
        return;
    }
    bool IsWinDown = e.KeyboardDevice.IsKeyDown(Key.LWin) | e.KeyboardDevice.IsKeyDown(Key.RWin);
    bool IsCtrlDown = e.KeyboardDevice.IsKeyDown(Key.LeftCtrl) | e.KeyboardDevice.IsKeyDown(Key.RightCtrl);
    bool IsAltDown = e.KeyboardDevice.IsKeyDown(Key.LeftAlt) | e.KeyboardDevice.IsKeyDown(Key.RightAlt);
    bool IsShiftDown = e.KeyboardDevice.IsKeyDown(Key.LeftShift) | e.KeyboardDevice.IsKeyDown(Key.RightShift);
    if (IsWinDown | IsCtrlDown | IsAltDown | IsShiftDown)
    {
        (sender as TextBox).Text =
          (IsWinDown ? "Windows + " : "") +
          (IsCtrlDown ? "Control + " : "") +
          (IsAltDown ? "Alt + " : "") +
          (IsShiftDown ? "Shift + " : "") +
          e.Key.ToString();
    }
}

ユーザーが入力したホットキーを保存していますが、メソッドKeyEventArgs.Key.ToString()の「keys」パラメーターに簡単に渡すことができるように保存する必要がありますSendKeys.Send()

誰かが私がこれを行う方法を提案できますか?

4

2 に答える 2

1

WPF Key enum と Winforms SendKeys.Send()メソッドを混在させようとしていますが、これはおそらくお勧めしません。Key 列挙型を直接使用し、Winforms をまったく使用せずに、WPF イベント システムでキーストロークを送信する方が、最終的にはクリーンでシンプルになります。この質問を参照してください。

ただし、どうしてもやりたい場合は、のドキュメントに従って文字列をフォーマットする必要がありますSendKeys.Send()。修飾キーには次のコードがあります。

  • シフト = "+"
  • CTRL = "^"
  • ALT = "%"

したがって、コードは次のようになります。

            (sender as TextBox).Text = "(" +
              (IsCtrlDown ? "^" : "") +
              (IsAltDown ? "%" : "") +
              (IsShiftDown ? "+" : "") + ")" +
              e.Key.ToString().ToLower();

たとえば、Ctrl+Alt+R を押す(^%)rと、 の有効な入力である文字列が得られますSendKeys.Send()。これは現在文字キーに対してのみ機能することに注意してください。Caps Lock などの他の特殊なキーを処理する場合は、コードを変更して値を確認しe.Key、ドキュメントから適切な文字列を出力する必要がありSendKeysます。

^{ESC}Windows キーはおかしいです。実際には Ctrl と Esc の組み合わせなので、に送信してエミュレートできるかもしれませんが、それSendKeysがニーズに合っているのか、単にスタート メニューを表示するだけなのかはわかりません。

また、WPF では実際に使用する必要があることに注意してください。この質問SendKeys.SendWait()を参照してください。

于 2013-01-02T22:59:11.237 に答える
0

SendInputAPI を使用してキーストロークを送信し、関数を使用してキーを仮想キー コードKeyInterop.VirtualKeyFromKeyに変換しました。System.Windows.Input.Key

于 2013-01-13T13:50:21.363 に答える