2011-12-06 14 views
2

Javaコードを使用してWindowsでアプリケーションを停止することはできますか? 私は、自分のPC上でアプリケーションを停止するためのショートカットのようなプログラムを作りたいと思っています。 ProcessBuilderを使用することは可能ですか?ありがとうJavaコードでアプリケーションを終了/停止する

+1

私はこれまで、* Runtime.exec *を使って* pskill * Windows util(それがまだ周りにあるかどうかわかりません)への呼び出しをラップすることによってこれを行いました。しかし、私はOSが* pskill *に関する保証をしているかどうかわかりません。 Windows上のAFAICTは、Un * xとははるかに異なっています。 * SIGKILL *を発行するUn * xは、プログラム**がただちに終了しなければならないことを意味し、すべてのリソース**をOSに返さなければなりません。(これは理論であり、実際にはうまくいきます。 – TacticalCoder

+0

TerminateProcessとNtTerminateProcessは、NTでSIGKILLを送信することに似ています。つまり、(LinuxとWindowsの場合、おそらくはほとんど* nixの場合)特定のプロセスにアクセスするプロセスのためにOSにプロセスを "即座に終了"システムリソース(決して戻ってこないIOコールなど) WindowsのSIGTERMのアナログは、アプリケーションがサービスでない限り、WM_CLOSEウィンドウメッセージをアプリケーションのウィンドウに送信することです。その場合は、ControlServiceをdwControl = SERVICE_CONTROL_STOPとともに使用してください。 – user314104

答えて

0

Javaコードを使用してWindowsでアプリケーションを停止することはできますか? ... ProcessBuilderを使用することは可能ですか?

あなたがそれを記入しようとしているのと同じJavaアプリケーションからアプリケーションを起動した場合のみ。

それ以外の場合は、Windows固有のコマンドを実行して、Windowsのネイティブライブラリ呼び出しを行うためにJNIに基づいた殺害を行う必要があります。

その他の合併症は、アクセス許可の問題により特定のプロセスを強制終了できないことがあり、プロセスによっては強制終了されないことがあります。

0

私はJREがシステムプロセス用のAPIを提供していないと信じています。 ProcessBuilder can システムプロセスを作成しますが、JVMの外部で作成されたプロセスに対してProcessオブジェクトを提供することはできません。可能な限り特定のOS固有の作業を避けるために、Javaの人々の哲学的決定であると私は信じています。すべてのOSがpidを持っていると思うかもしれませんが、すべてがある種のkillメッセージを持っていると思うかもしれませんが、JavaはたくさんのOSで動作します。

ネイティブコードを作成してJNIでラップすることはできますが、それは無駄です。 988052さんの言うとおり、Runtime.execまたはProcessBuilderでシステム固有のコマンドを実行することをお勧めします。どのOSをサポートするかを決める必要があります。また、それぞれのOSに適したコマンド(およびOS検出コード)を取得してください。

3

プレーンJava、ネイティブアクセスなし? No

ProcessBuilderを使用すると、Javaアプリケーション内で開始したプロセスを制御できますが、他のプロセスが開始したプロセスを制御することはできません。

user988052さんのコメントによるとのpskillRuntime.execでこれを達成できます。 pskillTerminateProcess関数呼び出しを使用します。この関数をJNI(またはJNA、NLinkなどの他のネイティブ呼び出し元)でも呼び出すことができますが、OpenProcess関数呼び出しを介してプロセスへのハンドルを取得する必要があります。

+0

OpenProcessを使用する場合は、必ずdwDesiredAccessでPROCESS_TERMINATE(0x0001)を要求してください。 – user314104

関連する問題