2010-09-02 56 views
2

我有一個運行在Windows服務器上的Java進程,我必須啓動命令行exe。我正在使用是否有可能從Java程序中捕獲Windows彈出消息框?

Process p = Runtime.getRuntime().exec(command); 
OutputStream stdin = p.getOutputStream(); 
InputStreamstderr = p.getErrorStream(); 
InputStream stdout = p.getInputStream(); 

運行進程並捕獲標準輸入/輸出流。我遇到的問題是我必須運行的exe文件中的一個會彈出一個彈出消息框,需要點擊「確定」才能完成失敗。
我的Java程序正在後臺運行,因此它沒有彈出消息框的窗口,這意味着當程序掛起時,Java程序將掛起,直到有人注意到它並在任務管理器中將其終止。

有沒有辦法能夠捕捉或檢測這些Java彈出框?

回答

1

你可能很幸運。 您可以使用JNA來調用Win32 API的EnumerateWindowsFindWindow。 然後通過FindWindowEx搜索按鈕。

然後「點擊」它通過調用PostMessage和發送BM_CLICK

你可能希望有一個獨立的觀察者線程做這一切,因爲你PROGRAMM等待進程結束或繼續。

對不起,我的回答很粗糙。晚餐有優先權。

+0

如果這是一種確定的方法,那麼在開始這條道路之前,我會思考很長時間。出於所有實際的目的,該應用程序不再是Java應用程序。 – Cumbayah 2010-09-02 20:50:00

+0

確實如此。但同時,應用程序的描述聽起來像是它永遠不會在Windows環境之外使用。 此外,當平臺特定的代碼被整齊地封裝在一個單獨的類中時,我會認爲這是一個相當困難但也是乾淨的解決方案。在Sunoracle沒有構建底層操作系統的橋樑的情況下,你必須自己動手。 – allesblinkt 2010-09-02 21:42:20

+0

這是一個有趣的想法。我擁有的應用程序實際上是一個需要在任何類型的操作系統上運行的較大系統。這種彈出式問題只發生在我必須運行的Windows服務器上,所以像這樣的想法仍然可以工作,我可以將它作爲exec()調用下的一個層添加進來。 – Sean 2010-09-02 23:33:06

0

不,這只是一個正在運行的過程。

產生任何引起GUI或任何其他無法通過標準輸入/輸出進行控制的控制方法都毫無意義。

+0

爲什麼這個選票被拒絕? -.- – Cumbayah 2010-09-02 20:46:19

+0

我有同樣的問題。 – CoolBeans 2010-09-02 20:49:29

0

不,不是直接據我所知。但是,你可能會做某種形式的異步通知。例如,您可以將特定應用發佈到您的應用可以訂閱的JSM隊列中的主題。如果您沒有選擇使用JMS路由,則可以使用基於文件通知的觸發器。您可以讓其他應用程序在公用目錄中創建一個虛擬文件,並讓您的應用程序監控該目錄。

底線是我不認爲你可以捕獲從你的過程中的另一個進程彈出。所以你需要做某種形式的外部/異步處理來捕獲它。

+0

如果你解釋投票背後的原因,我將不勝感激?如果沒有一個好的解釋,就不要投下一票! – CoolBeans 2010-09-02 20:38:15

+0

不想要的事實,我想。 ;/ – Cumbayah 2010-09-02 20:53:30

0

一個不雅,但簡單的解決方案將是超時。

相關問題