我正在尝试执行以下操作: 我有一个带网格的窗口,在每个单元格中我想显示一台远程计算机(使用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和after之后的行都被执行了,所以我不知道哪里出错了... 必须有可能,因为this guy做到了。
仅供参考,这是将进程添加到TableLayoutPanel的函数:
void AddProcessToTable(Process proc, string name)
{
Control panel = null;
// ...
// Retrieving panel
// ...
SetParent(proc.MainWindowHandle, panel.Handle);
SendMessage(proc.MainWindowHandle, 274, 61488, 0);
}
答案 0 :(得分: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();
}