2011-12-21 87 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

相关问题