7

Javaで記述されたサードパーティアプリケーションのワークフローを自動化するC#.NET2.0スクリプトを作成しようとしています。

私はuser32.dll関数を使用して、Javaアプリウィンドウと対話できるようにしています。

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

Stack OverflowProcess.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());
4

1 に答える 1

3

入力を送信したいウィンドウが画面に表示されていることを検出する方法があると思いますが、ウィンドウがビジーであるため、入力をすぐに送信することはできません。

事前定義/ハードコードされた待機間隔(Javaウィンドウごとにカスタマイズされている可能性があります)を設定できます。これは信頼性が高くありませんが、制御された環境(たとえば、アプリがコンピューターでのみ使用されている場合)ではうまく機能する可能性があります。

ロードが完了したときにウィンドウの外観が確実に変化する場合は、ウィンドウのスクリーンショットをキャプチャして、適切なピクセルが存在するかどうかをテストし、メッセージを送信する前にtrueになるまでこれを繰り返します。

もう1つのオプションは、Spy ++を使用して、読み込みが完了したときにウィンドウに対して特定のメッセージが生成されるかどうかを確認し(たとえば、特定のパラメーターを使用した再描画など)、それらのメッセージを検出するフックをインストールすることです。

Javaアプリケーションがネイティブウィンドウコントロール(SWT)を使用している場合は、ロードが完了したことを示すウィンドウテキスト/構造の変更を検出しようとすることができます。

ウィンドウの読み込みプロセスがリソースを大量に消費する場合は、JavaアプリのCPU使用率を監視し、メッセージを送信する前に「ピーク」の終了を待つこともできます。

于 2012-06-20T16:13:15.077 に答える