2009-04-17 32 views
1

我編寫了一個自動化測試程序,它隨機使用各種User32.dll庫調用點擊打開的應用程序窗口。我目前的問題是,如果點擊會打開一個對話框,使用Process.WaitForInputIdle()不會等待足夠長的時間,以便在循環的下一次行程中檢測到該對話,這意味着需要點擊幾次,如果這些點擊發生在我想避免的對話中(例如退出按鈕),無法事先告知。我的問題是這個。有沒有辦法等待進程或線程完成所有處理,只能再次在消息循環中等待?自動點擊問題

我希望這是有道理的。

乾杯

羅斯

編輯

如果做不到這一點,那會是在某種程度上可以設置過程/目標程序的線程和我的程序都使用相同的處理器和調整prioritorys每個目標程序都有偏好?

回答

0

解決這個問題的方法似乎是使用SendMessage API而不是mouse_event或SendInput API。這是因爲SendMessage阻塞,直到它被處理。只要確保你總是在你想要點擊的地方(使用WindowFromPoint)立即獲得窗口的句柄,並使用ScreenToClient將鼠標座標從屏幕轉換爲客戶端座標。使用((pt.Y < < 16)+ pt.X)將座標打包到lParam參數中。這將阻塞,直到進行處理,因此顯示的任何模態對話框將阻止此呼叫。

+0

這種方法似乎具有內置的缺點,因爲對發送的消息的響應最多不一致。例如,試圖用WM_NCLBUTTONDOWN/UP來使用這種方法來點擊記事本中的文件菜單,將導致菜單循環開始,然後立即結束,而不實際顯示菜單。 – Ross 2009-05-05 22:38:50

1

不幸的是,一旦應用程序處於沒有輸入消息等待的消息循環中,WaitForInputIdle就會返回。

如果您擁有該對話框的代碼,您可以讓該對話框調用其WM_INITDIALOG中的SetEvent,以向您的自動化表明它已準備好進行測試。或者,您可以查看在進程上使用SetWinEventHook,並在發送輸入事件之前等待實際創建對話框。

+0

感謝您的輸入,我正在編寫的程序旨在成爲一個相當通用的猴子測試程序,而不是針對任何特定的程序。因此,它將不會事先知道是否會由於任何行動而出現對話。如果有一個鉤子可以檢測到進程空閒,這將是理想的。 – Ross 2009-04-17 01:09:16