1. ホーム
  2. c#

[解決済み] C#でキー押下イベントをプログラム的に生成するには?

2022-09-07 11:11:38

質問

キーボードでキーが押されたことをシミュレートするイベントをプログラムで作成するにはどうしたらよいでしょうか?

どのように解決するのですか?

質問はWPFとタグ付けされていますが、これまでの回答は特定のWinFormsとWin32です。

WPFでこれを行うには、単純にKeyEventArgsを構築し、ターゲット上でRaiseEventを呼び出します。 たとえば、現在フォーカスされている要素に Insert キーの KeyDown イベントを送信するためです。

var key = Key.Insert;                    // Key to send
var target = Keyboard.FocusedElement;    // Target element
var routedEvent = Keyboard.KeyDownEvent; // Event to send
     target.RaiseEvent(
  new KeyEventArgs(
    Keyboard.PrimaryDevice,
    PresentationSource.FromVisual(target),
    0,
    key)
  { RoutedEvent=routedEvent }
);

このソリューションはネイティブコールやWindowsの内部に依存しないので、他のものよりもずっと信頼性が高いはずです。 また、特定の要素でキー入力をシミュレートすることができます。

このコードは PreviewKeyDown、KeyDown、PreviewKeyUp、および KeyUp イベントにのみ適用可能であることに注意してください。 もしTextInputイベントを送信したい場合は、代わりにこれを行うことになります。

var text = "Hello";
var target = Keyboard.FocusedElement;
var routedEvent = TextCompositionManager.TextInputEvent;

target.RaiseEvent(
  new TextCompositionEventArgs(
    InputManager.Current.PrimaryKeyboardDevice,
    new TextComposition(InputManager.Current, target, text))
  { RoutedEvent = routedEvent }
);

も注意してください。

  • コントロールは Preview イベントを受け取ることを想定しています。例えば PreviewKeyDown は KeyDown の前でなければなりません。

  • target.RaiseEvent(...)を使用すると、イベントを直接ターゲットに送信します。 のようなメタ処理なしで アクセラレータ、テキスト合成、および IME のようなメタ処理なしで、イベントをターゲットに直接送信します。 これは通常、あなたが望むことです。 一方、もしあなたが本当に 実際のキーボードのキーをシミュレートしたい を使うことになるでしょう。 InputManager.ProcessInput()を使用します。