9

リモートデスクトップセッションで実行されているアプリケーションに偽のキーボード入力を送信しようとしています。私が使用しているもの:

Byte key = Ord("A");

keybd_event(key, 0, 0, 0); // key goes down
keybd_event(key, 0, KEYEVENTF_KEYUP, 0); // key goes up

これで、このコードは文字「a」を任意のローカルウィンドウに送信しますが、リモートデスクトップウィンドウには送信しません。

つまり、リモートデスクトップを使用してサーバーに接続し、そのサーバーでメモ帳を開きます。キーボードのキーを手動でパンチすると、メモ帳のエディターウィンドウに表示されます。ただし、keybd_eventの偽のキーボード入力によって「a」がメモ帳に表示されることはありません。

ローカルマシンで実行されているアプリケーションから、リモートデスクトップ接続内で実行されているアプリケーションに偽のキーボード入力をプログラムで送信するにはどうすればよいですか?


Nitpickersコーナー

この特定のケースでは、アイドルタイムアウトを打ち負かそうとしているので、これを実行したいと思います。しかし、私は同じようにしようとしている可能性があります

  • UI自動化テストを実行する
  • UIストレステスト
  • UI障害検出テスト
  • UIユニットテスト
  • UIデータ入力テスト
  • UIペイントテスト
  • またはUIの復元力テスト。

言い換えれば、それを望んでいる私の理由は重要ではありません

注:タイムアウトは、リモートデスクトップが非アクティブであることが原因である場合と、そうでない場合があります。わかりませんが、質問には影響しません。

4

4 に答える 4

7

答え

Microsft は、OEM コードを送信する必要はなく、送信すべきではないと言っていますが、OEM スキャン コードを送信する必要があります。この例では、OEM スキャン コードを送信する必要があります。

  • キーAが下がる
  • キーAが上がる

さまざまなキーのメイクおよびブレーク スキャン コードを一覧表示するCodeProject のチャートの写真があります。

代替テキスト

私の場合、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

私はこれをテストしましたが、動作します。だから、すべてが順調です。

于 2008-12-05T21:54:56.493 に答える
2

PsExecを使用してautoitスクリプトを実行できるかもしれません。これは、クライアントソフトウェアを手動でインストールしなくても、コンソールアプリケーションの完全な対話機能を備えた、他のシステムでプロセスを実行できる軽量のtelnet置換です。

(AutoItは、任意の信号(キーまたはその他)を任意のウィンドウアプリケーションに送信することができ、リモートデスクトップのPsExecで起動できます)

たとえば、 KillSaverのようなAutoItスクリプトは、コンピューターでのアイドル時間が長くなるのを防ぐためにマウスを動かすように設計されています。

于 2008-12-05T21:16:29.770 に答える
2

これは非常にうまくいきました。キーボードスキャンコードを取得するには、次を使用できます。

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
于 2010-02-25T06:49:38.570 に答える
0

SendMessage(); を使用できます。それは実際には、キーのはるかに優れたシミュレーターです。さて、これで頑張ってください!

于 2009-11-22T10:45:00.647 に答える