2011-12-06 101 views
2

使用java代碼可以在Windows中停止應用程序嗎? 我想創建一個程序,就像在我的電腦上停止應用程序的快捷方式。是否有可能使用ProcessBuilder?謝謝使用Java代碼終止/停止應用程序

+1

我在過去通過使用* Runtime.exec *將調用包裝到* pskill * Windows util(不知道是否仍在使用)。但是我不知道OS * *關於* pskill *的保證。在Windows上的AFAICT與在Un * x上的不同。在Un * x發佈* SIGKILL *意味着程序**必須立即退出,並且必須將其所有資源**返回給操作系統(這是理論並且在實踐中運行良好)。 – TacticalCoder

+0

TerminateProcess和NtTerminateProcess類似於在NT中發送SIGKILL - 也就是說,它要求操作系統「立即」終止進程,儘管(對於Linux和Windows以及可能是大多數的* nix),這可能由於進程訪問某些系統資源(例如永不返回的IO調用)。 Windows中SIGTERM的模擬是將WM_CLOSE窗口消息發送到應用程序的窗口,除非應用程序是服務。在這種情況下,使用ControlService和dwControl = SERVICE_CONTROL_STOP。 – user314104

回答

0

是否有可能使用java代碼停止窗口中的應用程序? ...是否有可能使用ProcessBuilder?

只有當您嘗試從相同的Java應用程序啓動應用程序時,纔會嘗試從中填充應用程序。

除此之外,您需要求助於運行特定於Windows的命令來執行查殺......或基於JNI的操作來創建本機Windows庫調用。

其他併發症是您可能無法殺死某些進程由於權限問題,並且某些進程可能會被拒絕被終止。

0

我相信JRE不會爲系統進程提供API。 ProcessBuilder可以創建系統進程,但它不能爲您在JVM之外創建的進程提供一個Process對象。我相信這是Java人員的哲學決定,儘可能避免某些特定於操作系統的任務。你可能認爲每個操作系統都有pid,或者它們都有某種kill消息,但是Java運行在很多操作系統上,其中一些非常奇怪。

你可以讓本機代碼做到這一點,並用JNI包裝,但這會很浪費。正如988052先生所說,我建議你通過Runtime.execProcessBuilder執行系統特定的命令。您需要決定要支持哪些操作系統,並確保爲每個操作系統獲取命令(以及操作系統檢測代碼)。

3

平原的Java,沒有本地訪問?編號

ProcessBuilder允許您控制從Java應用程序內啓動的進程,但它不會讓您控制由其他進程啓動的進程。

根據用戶988052的評論,您可以使用Sysinternals Suite中的pskill,通過Runtime.exec完成此操作。 pskill使用TerminateProcess函數調用。您也可以使用JNI(或其他本地調用方,如JNA,NLink等)調用此函數,但您需要通過OpenProcess函數調用獲取該進程的句柄。

+0

如果您使用OpenProcess,請確保您在dwDesiredAccess中請求PROCESS_TERMINATE(0x0001)。 – user314104