1

C#プログラムからJavaアプリケーションを制御しようとしています。プログラムはデータの入力を開始する前に、以前のデータ入力ウィンドウがあるかどうかを確認し、それらを閉じようとします。

ウィンドウが存在するかどうかを確認するためのコードは次のとおりです。

public static bool WindowExists(string WindowName)
{
    IntPtr hWnd = FindWindow(null, WindowName);
    return (hWnd != IntPtr.Zero);
}

これまでは、開いている入力ウィンドウがなくなるまで、このメソッドをwhileループ(ウィンドウにAlt + F4を送信)で使用していました。

しばらく前にJavaアプリケーションが更新され、このメソッドは機能しなくなりました。何らかの理由で、WindowExistsは、データ入力ウィンドウが閉じられた後でもtrueを返し続けます。これは、入力ウィンドウが少なくとも1回存在した場合にのみ発生します。

Thread.Sleep()をループに追加して、これがJavaアプリの遅延が原因ではないことを確認しようとしましたが、機能しませんでした。

WindowExistsを呼び出すだけで、入力ウィンドウがクラッシュすることがあります。

以前に動作したことがあり、他のプログラムでも動作するため、コードに問題はありません。したがって、Javaプログラムの更新に問題があるはずです。

ウィンドウが存在するかどうかを確認するための代替/より信頼性の高い方法はありますか?Alt + F4の送信を「ウィンドウを閉じるイベント」に変更することも試してみる価値があるかもしれませんが、このイベントを別のプログラムのウィンドウに送信する方法がわかりません。

私は初心者なので、答えは単純にしてください。

前もって感謝します。

4

5 に答える 5

1

Spy++を使用して Java アプリのウィンドウ ハンドルを監視し、他に何が起こっているかを把握できるかどうかを確認します。アプリが閉じていることを確認する方法が必要であることに同意します。

プロセスリストを見るのは論外だと思います...

于 2010-09-27T14:06:53.193 に答える
0

Java アプリとその結果として JVM が実行されている間、ウィンドウへの「ハンドル」はまだガベージ収集されていないため、基になるポインター メカニズムにはまだ有効であると思われます。

それを書いているのが私だった場合 (そして Java コードを変更できた場合) は、おそらく Java アプリにクエリを実行して、そのウィンドウが表示されているかどうかを確認する手段を追加するでしょう。ソケットインターフェースか何か。

于 2010-09-27T14:12:56.080 に答える
0

私の推測では、ウィンドウが Java コード/VM によって完全に破棄されていないか、何らかの特別な方法で Alt+F4 を処理している (つまり、ウィンドウを閉じるのではなく非表示にしている可能性がある) のいずれかです。

于 2010-09-27T14:16:18.753 に答える
0

ウィンドウの作成/削除は制御できません。必要な同じリソースを使用して「他の誰か」の存在を確実に検出したい場合は、その相手にそれを明示的に伝えてもらいます。

相手は、ファイルを作成したり、ポートを開いたりすることでその存在を知らせ、終了時にそれを解放/削除/閉じることができます。

于 2010-09-27T14:17:48.690 に答える
0

FindWindow によって返される hWnd 値に対して、IsWindow API を使用して追加のチェックを試みます。

于 2010-09-27T15:25:29.763 に答える