3

バックグラウンド

アクティブなウィンドウにキーボードコマンドを送信するために使用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);

質問

  1. Spy ++を使用して、アプリケーションのRemoteAppバージョンでアクティブな子ウィンドウを強調表示できます。取得RAIL_WINDOWしますが、プログラムでこのウィンドウにアクセスできないようです。上記のコードを考えると、そうすることができるために私は何が欠けていますか?

  2. リモートアプリ上で実行されているアプリケーションにキーボードストロークを送信する他の方法はありますか?

4

3 に答える 3

2

Microsoftがどのように物事を行うかを知っているので、「レールウィンドウ」は、SendKeysが送信しているものにわざわざ応答しない、ばかげたローカルプロキシにすぎないと思います。私は調べていませんが、WM_CHARメッセージを送信することになり、ダムプロキシはおそらく応答しません。代わりに、WM_KEYUPメッセージとWM_KEYDOWNメッセージを手動で送信してみて、それが機能するかどうかを確認してください。翻訳されたバージョンではなく、それらとマウスクリック(およびそうでないもの)が送信されると予想されます。

于 2010-10-05T21:45:45.287 に答える
0

どのコマンドを使用して送信していSendKeys()ますか?

`SendKeys()'を使用する代わりに、別の解決策を探す方がよい場合があります。

于 2010-10-05T10:32:48.313 に答える
0

また、FindWindowExなどを呼び出さなくても、適切なタイミングで適切なウィンドウハンドルを提供するIMsTscAxEvents:: OnRemoteWindowDisplayedイベントの処理を利用できる可能性があります。

于 2014-07-28T18:00:23.050 に答える