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/找到了(但没有测试)一篇关于如何使用它的文章服务/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 回答