リモートデスクトップセッションへのキーボード入力をシミュレートする方法は?

StackOverflow https://stackoverflow.com/questions/345147

質問

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スキャンコード:

alt text

私の場合、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 スクリプトを実行できますか://technet.microsoft.com/en-us/sysinternals/bb897553.aspx "rel =" nofollow noreferrer "> PsExec 、他のプロセスを実行できる軽量のtelnet-replacement手動でクライアントソフトウェアをインストールすることなく、コンソールアプリケーションの完全なインタラクティブ機能を備えたシステム。

(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()を使用できます。 それは本当にキーのためのはるかに優れたシミュレータです。 さて、これで幸運を!

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top