Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/windows/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
从Java在Mac中启动外部安装程序应用程序_Java_Windows_Macos_Runtime - Fatal编程技术网

从Java在Mac中启动外部安装程序应用程序

从Java在Mac中启动外部安装程序应用程序,java,windows,macos,runtime,Java,Windows,Macos,Runtime,我正在用Java创建一个小应用程序,需要从CD在Mac和Windows中使用 这个应用程序的基本思想就是有一个主菜单(Mac和Windows不同),你可以在主菜单中选择几个带有公司徽标的选项(安装应用程序、查看CD内容、查看帮助手册等) 要安装的应用程序在Windows和Mac中会有所不同 我想做的是启动外部安装程序,一旦安装,我想启动应用程序 我遇到的主要问题是,一旦我在另一个进程中启动了安装程序,waitfor()将返回一个有效的exitvalue并继续 我想等到这个应用程序完全安装后再运行

我正在用Java创建一个小应用程序,需要从CD在Mac和Windows中使用

这个应用程序的基本思想就是有一个主菜单(Mac和Windows不同),你可以在主菜单中选择几个带有公司徽标的选项(安装应用程序、查看CD内容、查看帮助手册等)

要安装的应用程序在Windows和Mac中会有所不同

我想做的是启动外部安装程序,一旦安装,我想启动应用程序

我遇到的主要问题是,一旦我在另一个进程中启动了安装程序,waitfor()将返回一个有效的exitvalue并继续

我想等到这个应用程序完全安装后再运行它

窗户

 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)

你能帮我吗


谢谢。

您似乎需要检查系统上是否存在安装窗口,而不是可执行文件。据我所知,在Java中没有独立于系统的方法来实现这一点,但是通过使用sun的JNA(它在windows和mac上都受支持,可以找到)这样强大的库,您可以通过适当的OS API调用来实现这一点

下面是一个示例,说明您可能希望在windows上执行的操作,mac呼叫应该类似:

    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
    }
导入com.sun.jna.platform.win32.User32;
导入com.sun.jna.platform.win32.WinDef;
.
.
.
//执行过程
进程p=Runtime.getRuntime().exec(“\”c:/…/ExternalAppforWin.exe\”);
//等待返回值
int res=p.waitFor();
//若我们有一个有效的返回码,开始等待窗口关闭
如果(res==0)
{
//定义一个窗口句柄变量
WinDef.HWND windowHandle=null;
做
{
//在轮询值之前,请先睡眠一会儿
试试{Thread.sleep(100);}catch(InterruptedException e){}
//尝试按标题获取窗口
windowHandle=User32.INSTANCE.FindWindow(null,“”);
//如果句柄不为null,则窗口仍处于打开状态,请休眠,然后重试
}while(windowHandle!=null&&windowHandle.getPointer()!=Pointer.null);
//继续你的代码
}

如果您觉得窗口状态正在被轮询到oftenHi Aaron,您可以增加睡眠时间。谢谢我们的帮助。我一直在研究Mac的com.sun.jna.platform,我只发现com.sun.jna.platform.Mac.MacFileUtils有两种方法:hasTrash()和moveToTrash(File[]文件),所以我认为它们对我没有帮助。还有其他想法吗?我明白了,似乎mac已经不推荐使用它的所有动态链接库来与用户界面交互,这就是为什么jna默认情况下没有内置到这些函数的绑定,然而,我确实找到了一个jna的扩展,该扩展用于绑定objective c库,更具体地说是cocoa框架。这个扩展名为洛可可,可以在我从未在mac上开发过的网站上找到,所以我不知道可可的来龙去脉,但它应该有你需要的绑定。我会研究一下洛可可,如果有解决办法,我会告诉你的。