2012-06-20 8 views
7

Javaで書かれたサードパーティアプリケーションでワークフローを自動化するC#.NET 2.0スクリプトを作成しようとしています。サードパーティのアプリケーションウィンドウが読み込まれるまで待つ

私はuser32.dll関数を使ってJavaアプリケーションウィンドウとやりとりできます。

私の問題は、Javaのアプリケーションウィンドウが完全にロードするのが遅いとIntPtr SendMessage(IntPtr hWnd, UInt32 Msg, UInt32 wParam, IntPtr lParam)を介して送信され、私の行動が時々失われることです。例:メインウィンドウの読み込み中にメニューを開こうとすると(実際にはメインウィンドウにハンドルがあります)、メッセージが失われてメニューが開かない

私はその目的のために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

私は既に私のスクリプトの仕事をするために眠っていました。私はその解決策で気に入らないのは、遅くなったり、スクリプトがうまくいかず、メッセージの解決に時間がかかることがあります。 ?私は機能することを認めざるを得ないhttp://www.pinvoke.net/default.aspx/user32/PrintWindow.html – Tuxicoman

+1

私はそれは関係なく、一番上にあるもののウィンドウをキャプチャしてP /呼び出しを経由してPrintWindow好みます必ずしもうまくいかない場合があります。私はpinvokeを試してみますが、私は良い(高速)画像比較機能が必要になります。 – Mari9

+0

:C#で – Tuxicoman

関連する問題