web-dev-qa-db-ja.com

C#でキープレスイベントをプログラムで生成するにはどうすればよいですか?

キーボードで押されているキーをシミュレートするイベントをプログラムで作成するにはどうすればよいですか?

103
Dan Vogel

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

WPFでこれを行うには、単にKeyEventArgsを構築し、ターゲットでRaiseEventを呼び出します。たとえば、現在フォーカスされている要素にInsert Key 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()を使用します。

141
Ray Burns

Windowsフォームコンテキストなしでキーイベントを生成するには、次の方法を使用できます。

[DllImport("user32.dll")]
public static extern void keybd_event(byte bVk, byte bScan, uint dwFlags, uint dwExtraInfo);

サンプルコードを以下に示します。

const int VK_UP = 0x26; //up key
const int VK_DOWN = 0x28;  //down key
const int VK_LEFT = 0x25;
const int VK_RIGHT = 0x27;
const uint KEYEVENTF_KEYUP = 0x0002;
const uint KEYEVENTF_EXTENDEDKEY = 0x0001;
int press()
{
    //Press the key
    keybd_event((byte)VK_UP, 0, KEYEVENTF_EXTENDEDKEY | 0, 0);
    return 0;
}

仮想キーのリストが定義されています ここ

完全な画像を取得するには、以下のリンクを使用してください http://tksinghal.blogspot.in/2011/04/how-to-press-and-hold-keyboard-key.html

26
Rajesh

私はそれを使用していませんが、 SendKeys はあなたが望むことをするかもしれません。

SendKeysを使用して、キーストロークとキーストロークの組み合わせをアクティブなアプリケーションに送信します。このクラスはインスタンス化できません。キーストロークをクラスに送信し、プログラムのフローをすぐに続行するには、送信を使用します。キーストロークによって開始されたプロセスを待つには、SendWaitを使用します。

System.Windows.Forms.SendKeys.Send("A");
System.Windows.Forms.SendKeys.Send("{ENTER}");

Microsoftには、さらにいくつかの使用例があります here

22

簡単に! (他の誰かがすでに私たちのために仕事をしていたため...)

提案された答えでこれを試して多くの時間を費やした後、私はこのコードプレックスプロジェクト に遭遇しましたWindows入力シミュレータ キーを押す:

  1. パッケージをインストールします。実行するか、NuGetパッケージマネージャーから、またはパッケージマネージャーコンソールから次のようにします。

    インストールパッケージInputSimulator

  2. 次の2行のコードを使用します。

    inputSimulator = new InputSimulator() inputSimulator.Keyboard.KeyDown(VirtualKeyCode.RETURN)

以上です!

10

Windows SendMessage API with send WM_KEYDOWN

7
np-hard