2010-02-03 94 views
1

我試圖找到一個對話框,只要它打開它的句柄。FindWindowEx無法找到窗口句柄

現在只要打開對話框,我嘗試在單獨的線程中爲該對話框調用FindWindowEx,但它返回NULL。

然後在調用FindWindowEx之前先進行一些睡眠。它在睡覺後有一段時間有效。

即使在創建對話框之前,它看起來像是FindWindowEx,並且睡眠有助於創建對話框,因此它有時會工作。

現在我已經把一些隨機值放在睡眠中。而且它看起來不是一個好方法,因爲它隨時都可能失敗。

是否有任何完整的證明方法,以便每次通過FindWindowEx都可以處理,而無需讓線程進入睡眠狀態。

+1

如何通知後臺線程調用FindWindowEx - 可能它是兩個線程之間的競態條件? – Ruddy 2010-02-03 18:53:46

+0

是的 - 你應該讓我們知道你的意思是「一旦它打開」。看起來你在實際創建對話框之前調用了'FindWindowEx()',因此可能有更好的方式來指示何時查找對話框,而不是現在正在使用的對話框。 – 2010-02-03 19:03:46

回答

1

一個非常簡單的解決方案是在循環中重複調用FindWindowEx

HWND h = NULL; 
while (1) { 
     h = FindWindowEx(...); 
     if (h) { 
     break; 
     } 
     Sleep(100); 
    } 

這不是防彈的 - 這是一個無限循環,如果對話框訥韋爾打開或關閉太快(儘管這不太可能)。爲了捕獲這兩種情況,讓主線程(創建並運行對話框)維護一個簡單的布爾屬性,工作線程會查詢是否仍然存在對話框。

+0

如果downvotwer告訴我爲什麼他認爲這是一個不好的答案,那將是非常好的。這很簡單,並且可以解決這個問題,而不會掛鉤(當然,OP說他不想睡覺,但我認爲他意味着他提到的單一隨機睡眠電話)。 – 2010-02-04 10:36:41

2

如果你正在尋找的對話框是你的對話框 - 也就是說,你控制了代碼 - 那麼你可以從對話框中發送一條消息給你的觀看應用程序,上面寫着「哦,你好!

如果對話框不是你的,並且你不想旋轉,你可以在WM_CREATE消息上使用create a Windows hook