запустить внешнее приложение установщика в Mac из Java - PullRequest
1 голос
/ 21 декабря 2011

Я создаю небольшое приложение на Java, которое необходимо использовать в Mac и Windows с компакт-диска.

Основная идея этого приложения - просто иметь главное меню (отличающееся для Mac и Windows).) где вы можете выбрать несколько вариантов (установить приложение, просмотреть содержимое компакт-диска, просмотреть справочное руководство ... и т. д.) с логотипом компании ... и т. д.

Приложение будетУстановка будет отличаться в Windows и Mac.

Что я хочу сделать, это запустить внешний установщик и после установки я хочу запустить приложение.

Основная проблема, которую яесть то, что как только я запустил установщик в другом процессе, waitfor () возвращает действительное значение выхода и продолжает.

Я хочу дождаться полной установки этого приложения, прежде чем пытаться его запустить.

для 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)

...

Не могли бы вы мне помочь?

Спасибо.

1 Ответ

0 голосов
/ 22 декабря 2011

Похоже, вам нужно проверить наличие в системе окна установки, а не исполняемого файла. Насколько я знаю, в Java нет системно-независимого способа сделать это, однако с использованием мощных библиотек, таких как Sun JNA (которые поддерживаются как в Windows, так и в Mac и могут быть найдены здесь ), вы может сделать это через соответствующие вызовы API OS.

Вот пример того, что вы можете сделать в 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
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...