リモートデスクトップセッションへのキーボード入力をシミュレートする方法は?
-
19-08-2019 - |
質問
iリモートデスクトップセッションで実行されているアプリケーションに偽のキーボード入力を送信しようとしています。私は使用しています:
Byte key = Ord("A");
keybd_event(key, 0, 0, 0); // key goes down
keybd_event(key, 0, KEYEVENTF_KEYUP, 0); // key goes up
このコードは、文字<!> quot; a <!> quot;を送信します。任意のローカルウィンドウに送信しますが、リモートデスクトップウィンドウには送信しません。
つまり、リモートデスクトップを使用してサーバーに接続し、そのサーバーでメモ帳を開きます。キーボードのキーを手動でパンチした場合:それらはメモ帳のエディターウィンドウに表示されます。しかし、keybd_eventの偽のキーボード入力により、<!> quot; a <!> quot;がメモ帳に表示されません。
ローカルマシンで実行されているアプリケーションから、リモートデスクトップ接続内で実行されているアプリケーションに偽のキーボード入力をプログラムで送信するにはどうすればよいですか?
ニトピッカーズコーナー
この特定のケースでは、アイドルタイムアウトを無効にしようとしているので、これを行いたいです。しかし、私もしようとしている可能性があります
- UI自動化テストの実行
- UIストレステスト
- UI障害検出テスト
- UI単体テスト
- UIデータ入力テスト
- UIペイントテスト
- またはUI復元力テスト。
言い換えれば、それを望む理由は重要ではありません
注:タイムアウトは、リモートデスクトップが非アクティブである場合とそうでない場合があります。わからないし、質問にも影響しません。
解決
回答
Microsftは必要はないと言っていますが、すべきではありません、OEMコードを送信します。OEMスキャンコードを送信する必要があります。この例では、OEMスキャンコードを送信する必要があります
- キーAがダウンします
- キーAが上がる
CodeProjectのグラフの画像がリストされていますさまざまなキーのmakeおよびbreakスキャンコード:
私の場合、keybd_eventの元の呼び出しを次のように変更する必要があります。
Byte key = Ord("A");
keybd_event(key, 0x1E, 0, 0); // key goes down
keybd_event(key, 0x9E, KEYEVENTF_KEYUP, 0); // key goes up
iはこれをテストし、動作します。すべて順調です。
他のヒント
(AutoItは任意の信号(キーまたはその他)を任意のウィンドウアプリケーションに送信でき、リモートデスクトップ上のPsExecで起動できます)
KillSaver などのAutoItスクリプトが設計されていますマウスを動かして、コンピューターのアイドル時間が長くなるのを防ぎます!
これは非常にうまくいきました。ありがとうございます。キーボードスキャンコードを取得するには、次を使用できます。
int scan;
scan = MapVirtualKey(key & 0xff, 0);
keybd_event(key, scan, 0, 0); // key goes down
keybd_event(key, scan | 0x80, KEYEVENTF_KEYUP, 0); // key goes up
SendMessage()を使用できます。 それは本当にキーのためのはるかに優れたシミュレータです。 さて、これで幸運を!