2011-12-21 88 views
1

我正在用Java創建一個需要在Mac和Windows中使用的Java應用程序。從Java啓動Mac中的外部安裝程序應用程序

這個應用程序的基本思想是隻有一個主菜單(不同的Mac和Windows),您可以選擇幾個選項(安裝應用程序,查看CD的內容,查看幫助手冊...等)以及公司的標誌等。

要安裝的應用程序在Windows和Mac中會有所不同。

我想要做的是啓動外部安裝程序,一旦安裝,我想啓動應用程序。

我的主要問題是,一旦我在不同的進程中啓動安裝程序,waitfor()將返回一個有效的exitvalue並繼續。

我想等到這個應用程序完全安裝,然後再嘗試運行它。

爲Windows

Runtime.getRuntime().exec(" \"c:/.../ExternalAppforWin.exe\""); 

爲Mac

File instFolder = new File(System.getProperty("user.dir") + "ExternalAppforMac.pkg") 
Process p = Runtime.getRuntime().exec(new String[] { "open", instFolder.toString() }); 
int exitVal = p.waitFor(); 
if (exitVal==0) 

...

你能幫助我嗎?

謝謝。

回答

0

看來您需要檢查系統上是否存在安裝窗口,而不是可執行文件。據我所知,在Java中沒有獨立於系統的方式來實現這一點,但是通過使用強大的庫,如sun的JNA(在Windows和Mac上都支持,可以在here中找到),可以通過適當的方式OS API調用。

這裏是你可能想在Windows上做一個例子,MAC呼籲應similiar:

import com.sun.jna.platform.win32.User32; 
    import com.sun.jna.platform.win32.WinDef; 

     . 
     . 
     . 

    //execute process 
    Process p = Runtime.getRuntime().exec(" \"c:/.../ExternalAppforWin.exe\""); 

    //wait for return value 
    int res = p.waitFor(); 

    //if we have a valid return code begin waiting for window to be closed 
    if(res == 0) 
    { 
     //define a window handle variable 
     WinDef.HWND windowHandle = null; 
     do 
     { 
      //sleep a little while before polling the value 
      try{Thread.sleep(100);}catch(InterruptedException e){} 

      //try to fetch the window by title 
      windowHandle = User32.INSTANCE.FindWindow(null, "<Window Title>"); 

      //if the handle is not null, the window is still open so sleep and then try try again 
     }while(windowHandle != null && windowHandle.getPointer() != Pointer.NULL); 

     //continue on with your code 
    } 
+0

可以增加睡眠時間,如果你覺得窗口狀態正在調查經常 – 2011-12-21 21:52:54

+0

亞倫嗨。感謝您的幫助。我一直在研究有關Mac的com.sun.jna.platform,我只用兩種方法找到com.sun.jna.platform.Mac.MacFileUtils:hasTrash()和moveToTrash(文件[]文件),所以我不知道不認爲他們會幫助我。任何其他想法? – user897013 2011-12-28 11:27:19

+0

我看到,似乎mac已經棄用它的所有動態鏈接庫來與用戶界面進行接口,這就是爲什麼jna沒有內建默認綁定到這些功能,但我確實找到了jna的擴展,綁定目標c庫,更具體地說是可可框架。該擴展名爲rococoa,可在http://code.google.com/p/rococoa/找到。我從來沒有在Mac上開發過,所以我不知道可可的來龍去脈,但它應該有綁定你需要 – 2012-01-02 10:05:50

相關問題