C#でプログラムによってkeypressイベントを生成するにはどうすればよいですか?


107

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


6
起動するイベントだけが必要ですか?
ダニエルA.ホワイト

「実際の」キープレスをシミュレートするには、アンマネージコードにステップインする必要があると思います。
ジョナスB

はい、イベントを発生させる必要があります。
ダン・フォーゲル

1
@GONeale:うわー、3年前のコメント。じゃあね。はい、これには有効な使用法があります。そのため、APIが最初から存在しています。しかし、それらは少数であり、はるかに離れています。私の経験では、問題に取り組むための最良の方法を理解していないため、多くの人がこれを実行します。たとえば、「ボタンクリックイベントハンドラーでコードを呼び出したいだけでなく、ボタンがクリックされたときだけ」。したがって、初心者にとっては、ボタンクリックをシミュレートするのが理にかなっています。実際に行うべきことは、そのコードを受け取り、それを関数にスローして、コードの他の場所から呼び出すことです。
Ed S.

6
@EdS:質問はかなり重要でした。キーパッドの作成について多くの余分な詳細を追加できたかもしれませんが、それでも同じ答えが得られました。自分が必要とするものを正確に手に入れたことを考えると、それは「質の悪い」質問には思えません。
Dan Vogel

回答:


147

質問には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 }
  );

また、次のことに注意してください。

  • コントロールはプレビューイベントを受け取ることを想定しています。たとえば、PreviewKeyDownはKeyDownの前に置く必要があります。

  • target.RaiseEvent(...)を使用すると、アクセラレータ、テキスト構成、IMEなどのメタ処理なしで、イベントがターゲットに直接送信されます。これは通常あなたが望むものです。一方、何らかの理由で実際のキーボードのキーを実際にシミュレートする場合は、代わりにInputManager.ProcessInput()を使用します。


1
私はあなたの提案を試してみましたが、効果はありません。フォーカスされた要素にkeyDownイベントハンドラーをアタッチしました。私が発生させたイベントは受け取りましたが、KeyStateはNone、ScanCodeは0、isDownはfalseです。これはキーボードの実際の状態なので、これらの値を取得していると思います。実際のキーボードのキーを押すと、KeyState = Down、isDown = true、ScanCodeに値があります。
Dan Vogel、

24
キーダウンの最初のコードを試したところ、「ターゲット」でエラーが発生しました。それをビジュアルに変換できないのはなぜですか?
カルタル

3
ダン、修飾キー(Ctrl / Alt / Shift)でキーを押すことをエミュレートする方法を知っていますか?特に、InputBindingをシミュレートする必要があります。m_shell.InputBindings.Add(new KeyBinding(m_command、Key.Insert、ModifierKeys.Control | ModifierKeys.Alt));
Shrike

14
ターゲットの問題、私が使用してそれを働いKeyboard.PrimaryDevice.ActiveSource参照くださいstackoverflow.com/questions/10820990/...
OscarRyz

4
この答えは非常に良いですが、@ Shrikeが指摘したように、修飾子付きのキーの送信には使用できません。(例: Ctrl+C)
ANeves、2015年

28

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


ウィンドウが上になる場合に適しています。それは私の状況を部分的に解決しました、ありがとう!
セルゲイ

Rajeshの回答に加えて、モバイルプラットフォームでこれを実行する場合は、「coredll.ddl」をインポートする必要があります
user1123236

22

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

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

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

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


3
SendKeys.Sendを使用してみましたが、次のInvalidOperationExceptionが発生しました:「アプリケーションがWindowsメッセージを処理していないため、SendKeysをこのアプリケーション内で実行できません。メッセージを処理するようにアプリケーションを変更するか、SendKeys.SendWaitメソッドを使用してください。」SendKey.SendWaitを使用しても効果はありません。
Dan Vogel、

重要なイベントを自分に送信していないことを確認してください。イベントを送信する前に、適切なプロセスにフォーカスを切り替えます。2番目のリンクされた記事には、それに関するいくつかの助けがあります。
Michael Petrotta、

11

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

提案された回答でこれを試すために多くの時間を費やした後、このcodeplexプロジェクトのWindows Input Simulatorに出くわしました。

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

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

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

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

以上です!

-------編集--------

codeplexのプロジェクトページには、何らかの理由でフラグが立てられています。これは、NuGetギャラリーへのリンクです。


これは非常にうまく機能しますが、キーの組み合わせでこれを機能させる方法を見つけることができませんでした
user1234433222

キーの組み合わせとは、CTRL-Cのような意味ですか?
Ravid Goldenberg 2016

はい、またはコンソールアプリケーションを全画面表示にしたい場合(Alt-Enterなど)、F11を使用して全画面表示にできることはわかっていますが、Alt-Enterが機能するかどうかを確認するとよいでしょう:)
user1234433222

1
それはできますが、まだ試していませんが、inputSimulator.Keyboard.ModifiedKeyStroke(VirtualKeyCode.CONTROL、VirtualKeyCode.VK_C);を使用してください。
Goldenberg

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.