我正在嘗試執行以下操作: 我有一個帶有網格的窗口,並且在每個單元中我想顯示遠程計算機(使用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);
但是當我這樣做,我的啓動進程,但他們沒有在面板中去。我把斷點檢查,並在這段時間和之後的行被執行,所以我不知道哪裏可能出錯... 這一定是可能的,因爲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);
}
我不知道,如果連接跨越進程和線程窗口層次是一個好主意。 – usr
是的,我還在想混合winapi和任務聽起來很麻煩,但它在工作時(通過Thread.Sleep)大大加快了整體處理速度。我只想讓它對Thread.Sleep更少依賴,我不知道爲什麼我的兩個解決方案之間存在行爲差異 –