2012-06-20 83 views
7

我正在嘗試創建一個C#.NET 2.0腳本來自動化以Java編寫的第三方應用程序中的工作流。等待第三方應用程序窗口加載

我使用user32.dll中的功能,以便能夠與Java應用程序窗口交互。

我的問題是,Java應用程序的窗口是緩慢的加載完全通過IntPtr SendMessage(IntPtr hWnd, UInt32 Msg, UInt32 wParam, IntPtr lParam)送我的行動有時會丟失。例如:在加載主窗口期間,如果我嘗試打開一個菜單(此時我實際上在主窗口上有一個句柄),我的消息就會丟失,菜單也不會打開。

我在Stack Overflow上發現了一些答案,告訴我們可以使用Process.WaitForInputIdle()方法,但是我發現這隻適用於應用程序是單線程的,而不是我的Java應用程序的情況。 (C# SendKeys Wait for Program to Load before sending

我在找工作的事同樣的想法,但是支持多線程或者您有任何其他的想法?!)

繼Mari9' 的想法,我終於用System.Diagnostic.PerformanceCounter()觀看第三第三方應用程序處理活動然後它變爲0,這意味着該過程已經完成了它必須做的事情並且能夠執行我發送的消息。

PerformanceCounter PC = new PerformanceCounter(); 
PC.CategoryName = "Process"; 
PC.CounterName = "% Processor Time"; 
PC.InstanceName = "<process name>"; 
Console.WriteLine(PC.NextValue().ToString()); 
+0

刪除答案,因爲我沒有讀到你的問題的第二半:-( – Schwarzie2478

回答

3

我假設你有檢測,當你想在窗口輸入發送到屏幕上顯示,而是立即發送輸入不起作用,因爲窗口是忙碌的一種方式。

你可以有一個預定義的/硬編碼的等待間隔(可能爲每個Java窗口定製) - 這不是非常可靠,但可以在受控環境下運行(例如,如果該應用程序僅用於您的計算機)。

如果窗口的外觀改變了可靠加載完成時,你可能會捕獲的窗口和測試的截圖,看看右邊的像素都是存在的,並且在發送消息之前重複這一點,直到正確的。

另一種選擇是使用間諜++,以查看是否要窗口中生成的任何特定消息中的加載完成時(例如,可以是具有一定的參數重繪)和安裝一個掛鉤,以檢測那些消息。

如果Java應用程序使用本機窗口控件(SWT),你可以嘗試以檢測窗口的文本/結構表明加載完成的變化。

如果窗口加載過程是資源密集型的,你也可能監控Java應用程序的CPU使用率,併發送郵件前等待「峯值」的結束。

+0

我已經用睡覺讓我的腳本工作,我不喜歡這個解決方案是,我保留足夠的保證金,腳本將慢或我沒有足夠的使用和腳本有時會失敗。對於消息解決方案,我還沒有找到一個消息,指出完成窗口加載。關於你的屏幕截圖的想法,你知道一個API可以正常工作在C#中? – Tuxicoman

+1

我喜歡PrintWindow通過P/Invoke,因爲它捕獲窗口,無論頂部是什麼:http://www.pinvoke.net/default.aspx/user32/PrintWindow.html – Mari9

+0

我不得不承認,我的功能並不總是工作,我可能會嘗試一下,但我需要一個好的(快速)圖像比較功能。 – Tuxicoman