我正在尝试执行以下操作:我有一个带有网格的窗口,并且在每个单元格中我想显示一台远程计算机(使用 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);
}