Microsoft RemoteApp 内の子ウィンドウをプログラムで検索する
質問
背景
使っています SendKeys()
キーボードコマンドをアクティブウィンドウに送信するには、アプリケーションがRemoteAppを介して実行されているときに子ウィンドウを見つけることができません。アプリケーションをローカルで実行すると、すべて期待どおりに動作します。
Microsoft リモートアプリ ユーザーは RDP プロトコルを介してアプリケーションに接続できますが、リモート仮想マシン全体が表示されるのではなく、アプリケーション ウィンドウのみが表示されます。エンド ユーザーにとって、RemoteApp で実行されるアプリケーションとデスクトップで実行されるアプリケーションに違いはありません。
Win32 API 関数を使用できるように、ManagedSpy を使用して .NET アプリケーション ウィンドウのクラス名を決定しています。 FindWindowEx
子ウィンドウの 1 つをアクティブにすると、うまく機能します。ただし、アプリケーションが RemoteApp 上で実行されているときに問題が発生します。
.NET は引き続き使用できます Process.GetProcessesByName()
アプリケーションを見つけるには、アプリケーションを呼び出すだけです mstsc.exe
:
IntPtr hwndChild = IntPtr.Zero;
Process[] processess = Process.GetProcessesByName("mstsc");
IntPtr appHandle = IntPtr.Zero;
foreach (Process p in processess)
{
if ((p.MainWindowHandle != IntPtr.Zero))
{
appHandle = p.MainWindowHandle;
}
}
if (appHandle == IntPtr.Zero)
{
MessageBox.Show("Application is not Running.");
return;
}
ただし、使えない FindWindowEx
同じやり方で。この質問はそれを中心に展開しています。
アンマネージ コードでどのウィンドウを表示するかについては、 mstsc.exe
アクティブです。Spy++を使用しましたが、 mstsc.exe
という別のクラス名で返されます。 RAIL_WINDOW
:
子ウィンドウを見つけるために使用しているコードは次のとおりです。
[DllImport("USER32.DLL")]
public static extern bool SetForegroundWindow(IntPtr hWnd);
[DllImport("user32.dll", SetLastError = true)]
private static extern IntPtr FindWindowEx(IntPtr parentHandle, IntPtr childAfter, string className, string windowTitle);
hwndChild = FindWindowEx(appHandle, IntPtr.Zero, "RAIL_WINDOW", "MyApplication (Remote)");
SetForegroundWindow(hwndChild);
質問
Spy++ を使用して、アプリケーションの RemoteApp バージョンでアクティブな子ウィンドウを強調表示できます。
RAIL_WINDOW
, しかし、プログラムからこのウィンドウにアクセスできないようです。上記のコードを考えると、これを実行するには何が足りないのでしょうか?リモート アプリ上で実行されているアプリケーションにキーボード ストロークを送信する他の方法はありますか?
解決
は、Microsoftが物事をどうするか、私は「レール・ウィンドウ」を賭ける知ることはのSendKeysが送信されたものに応答して気にしないダム、ローカルプロキシ以外の何ものでもありません。私は見ていないが、私はダムプロキシがおそらく応答気にしないことになるとWM_CHARメッセージを、送信するまでその端を賭けます。代わりに、手動でWM_KEYUPとWM_KEYDOWNメッセージを送信しようとすると、翻訳版ではなく、私はそれがそれらとマウスクリック(とものではありません)を送信するであろう期待していることを考えると、その作品かどうかを確認します。
他のヒント
あなたはSendKeys()
を使用してどのようなコマンドを送信していますか?
これは代わりに `のSendKeysを()」を使用しての代替ソリューションのためのより良い表情になることがあります。
そしておそらく、IMsTscAxEvents:: の処理を活用できるでしょう。リモートウィンドウ表示時 FindWindowEx などを呼び出さずに、適切なタイミングで適切なウィンドウ ハンドルを提供するイベント。