0

私は次のことをしようとしています:グリッド付きのウィンドウがあり、各セルに遠くのコンピューターを表示したい(VNCを使用)。そのために、プロセスを開始してパネルに配置します。

私の問題は、そのプロセスが特定のウィンドウになるのを待たなければならないことです(認証ウィンドウが、必要な実際のウィンドウの前に短時間表示されるため)。

したがって、開始する必要があるプロセスごとに、次のようにします。

Task t = Task.Factory.StartNew(() =>
{
    Process proc = Process.Start(@"C:\Program Files\RealVNC\VNC4\vncviewer.exe", name + " -Scaling AspectFit -Enabletoolbar=0");
    Thread.Sleep(4000); // Wait for real window
    this.BeginInvoke((MethodInvoker)delegate
    {
         AddProcessToTable(proc, name); // Adds the window in the panel
    });
});

そして、それはうまくいきます。しかし、をこれに置き換えたい場合Thread.Sleep():

while (!proc.MainWindowTitle.Contains(name))
    Thread.Sleep(10);

しかし、そうすると、プロセスが開始されますが、パネルには表示されません。ブレークポイントを置いて確認したところ、while と while の後の行が実行されるので、どこが間違っているのかわかりません。

参考までに、これは TableLayoutPanel にプロセスを追加する関数です:

void AddProcessToTable(Process proc, string name)
{
    Control panel = null;
    // ...
    // Retrieving panel
    // ...

    SetParent(proc.MainWindowHandle, panel.Handle);
    SendMessage(proc.MainWindowHandle, 274, 61488, 0);
}
4

1 に答える 1

0

Thread.Sleepの代わりに、proc.WaitForInputIdle()を使用してみませんか。これは、プロセスがメインウィンドウのメッセージループに入り、入力の準備ができるのを待ちます。http://msdn.microsoft.com/en-us/library/8d7363e2.aspxにドキュメントがあり、http : //www.akadia.com/で使用方法に関する記事を見つけました(ただし、テストはしていません) 。 services / dotnet_process_handling.html

Process process = new Process();
    process.StartInfo.FileName = "Notepad";
    process.Start();

    process.WaitForInputIdle();

    Thread.Sleep(5000);
    if(!process.CloseMainWindow())
    {
        process.Kill();
    }
于 2012-12-12T10:48:43.427 に答える