バックグラウンド
アクティブなウィンドウにキーボードコマンドを送信するために使用SendKeys()
していますが、アプリケーションがRemoteAppを介して実行されているときに、子ウィンドウを見つけることができません。アプリケーションをローカルで実行すると、すべて期待どおりに機能します。
Microsoft RemoteAppを使用すると、ユーザーはRDPプロトコルを介してアプリケーションに接続できますが、リモート仮想マシン全体を表示するのではなく、アプリケーションウィンドウのみを表示します。エンドユーザーにとって、RemoteAppで実行されているアプリケーションとデスクトップで実行されているアプリケーションに違いはありません。
私はManagedSpyを使用して.NETアプリケーションウィンドウのクラス名を決定しているので、Win32 API関数FindWindowEx
を使用して子ウィンドウの1つをアクティブにすることができ、それはうまく機能します。ただし、アプリケーションがRemoteApp上で実行されているときに問題が発生します。
.NETProcess.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
しますが、プログラムでこのウィンドウにアクセスできないようです。上記のコードを考えると、そうすることができるために私は何が欠けていますか?リモートアプリ上で実行されているアプリケーションにキーボードストロークを送信する他の方法はありますか?