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