キーボードでキーが押されたことをシミュレートするイベントをプログラムで作成するにはどうすればよいですか?
5 に答える
質問には 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() を使用します。
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
私はそれを使用していませんが、SendKeysはあなたが望むことをするかもしれません。
SendKeys を使用して、キーストロークとキーストロークの組み合わせをアクティブなアプリケーションに送信します。このクラスはインスタンス化できません。キーストロークをクラスに送信し、すぐにプログラムのフローを続行するには、Send を使用します。キーストロークによって開始されたプロセスを待機するには、SendWait を使用します。
System.Windows.Forms.SendKeys.Send("A");
System.Windows.Forms.SendKeys.Send("{ENTER}");
Microsoft には、さらにいくつかの使用例があります ここ。
簡単に!(他の誰かがすでに私たちのために仕事をしていたので...)
提案された回答でこれに多くの時間を費やした後、このコードプレックス プロジェクトWindows 入力シミュレーターに出会いました。
パッケージをインストールします。NuGet パッケージ マネージャーから、または次のようなパッケージ マネージャー コンソールから実行できます。
インストール パッケージ InputSimulator
次の 2 行のコードを使用します。
inputSimulator = new InputSimulator() inputSimulator.Keyboard.KeyDown(VirtualKeyCode.RETURN)
以上です!
- - - -編集 - - - -
codeplex のプロジェクト ページには何らかの理由でフラグが付けられています。これは NuGet ギャラリーへのリンクです。
send WM_KEYDOWNを使用したWindows SendMessage API。