[英]Wait for third party application window to load
我正在嘗試創建一個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在發送前等待程序加載 )
我正在尋找一些工作相同的想法,但支持多線程或任何其他想法的東西?!:)
遵循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());
我假設您有一種方法可以檢測到您想要發送輸入的窗口何時顯示在屏幕上,但由於窗口繁忙,立即發送輸入不起作用。
您可以擁有預定義/硬編碼等待間隔(可能為每個Java窗口自定義) - 這不是很可靠,但可以在受控環境中很好地工作(例如,如果應用程序僅在您的計算機上使用)。
如果在加載完成后窗口的外觀可靠地更改,您可以捕獲窗口的屏幕截圖並測試是否存在正確的像素,並在發送消息之前重復此操作直到為true。
另一種選擇是使用Spy ++來查看在加載完成時是否為窗口生成任何特定消息(例如,可能是具有某些參數的重繪)並安裝鈎子來檢測這些消息。
如果Java應用程序使用本機窗口控件(SWT),您可以嘗試檢測窗口文本/結構中的更改,指示負載已完成。
如果窗口加載過程是資源密集型的,您還可以監視Java應用程序的CPU使用情況,並在發送消息之前等待“峰值”結束。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.