24

SendKeys を介してキーストロークをアプリケーションに挿入するアプリケーションがあります。

残念ながら、SendKeys がリモート デスクトップで動作しないというよく知られた問題のため、リモート デスクトップ経由でアプリケーションを実行するとアプリケーションが動作しません。

誰かが以前にこの問題を解決したことがありますか、または解決方法について何か良い提案はありますか?

4

4 に答える 4

9

主に次の理由により、SendKeys は適切ではありません。

  • アクティブ/フォーカスされたアプリケーションにのみキーを送信できますが、キーが実際に送信される間にアクティブなアプリケーションが変更される可能性があるため、動作が保証されることはありません。
  • RDP およびその他の多くのライブラリ (DirectX など) は、主にセキュリティ上の理由からそれらをブロックします。

より良い代替手段:

を使用したサンプルコードSendMessage:

HWND hwndNotepad = FindWindow(_T("Notepad"), NULL);
HWND hwndEdit = FindWindowEx(hwndNotepad, NULL, _T("Edit"), NULL);
SendMessage(hwndEdit, WM_SETTEXT, NULL, (LPARAM)_T("hello"));
于 2011-08-26T16:16:43.680 に答える
4

私の場合、ハードウェア スキャン コードで WinAPI の SendInput を使用することに成功しました。SendKeys が char をマッピングしてコードを正しくスキャンしていないようです。

于 2013-03-30T10:24:54.443 に答える
3

デスクトップを使用前に常にログインする (または起動時に自動ログインするように設定する) ことで、RDP の問題を回避できます。

また、自動ログインを使用しても、自動化を実行したり、システムを管理したりするためにリモート デスクトップ アクセスが必要な場合は、リモート アクセスに RDP ではなく VNC を使用することをお勧めします。理由は、VNC がクロス プラットフォームであり、この RDP の問題に遭遇しないためです。VNC は、実際のデスクトップ (RDP コンソール セッション 0 またはマシンの「ヘッド」) のリレーのように機能します。欠点は、一度に 1 つのリモート セッションしかないことです (または、すべて同じデスクトップ + キーボード + マウスを共有します)。VNC は仮想マシンでも機能します。(VMWare/Hyper-V/Xen) 仮想マシン マネージャ ソフトウェアからの RDP またはローカル (RDP) アクセスの代わりに VNC を使用します。

VNC で注意すべき唯一のことは、デスクトップがアイドル状態またはスクリーンセーバーで自動ロックするように構成されていないことです。これにより、キーの送信と GUI オートメーションの実行が停止する可能性があるため、必ず無効にしてください。スクリーンセーバーとモニターの省電力は問題ありませんが、自動ロックとパスワード保護はありません。

注: 確かではありませんが、VNC はデスクトップを「そのまま」リレーするため、アプリ/システムの観点からローカルで実行するのと同じであると考えているため、理論的にはシステム/アプリをだますこともできるはずです。 RDP 経由の SendKeys を許可しません。AutoIt + SendKeys にこの VNC メソッドを使用しても問題はありませんでした。これは、VNC 経由でアクティブに接続されているか、切断されているかに関係なく (sendkeys/automation は、実際のデスクトップではまだログインしているため、切断後も引き続き機能します。VNC がアクティブ)。

于 2011-09-07T04:59:20.173 に答える
0

私の場合、テスト自動化の一部として sendkeys を使用していました。ビルド エージェントがリモート デスクトップ プロトコルを介して実行されるビルド マシンからは機能しません。私はそれについて満足していませんが、自動ビルドの一部としてそのテストをスキップすることができました.

Win32 呼び出しを使用してウィンドウ メッセージを送信するとうまくいくかもしれません。時間があれば、いつか試してみるかもしれません。

とにかく、現在のコードがリモートデスクトップセッションで実行されているかどうかを確認するためのチェックは次のとおりです。

System.Environment.GetEnvironmentVariable("SESSIONNAME").StartsWith("RDP-")
于 2011-08-29T16:31:36.137 に答える