我在C++程序內使用CreateProcess調用來執行運行Java Swing GUI應用程序的JAR文件。所有的工作都很好,除了Java應用程序的啓動最小化之外,我希望它以顯示的窗口開始。下面是相關的代碼片段:用於運行JAR文件的CreateProcess最小化窗口開始
// Construct the command string to be used for the CreateProcess call,
//including a parameter string
sprintf(cmdStr, "javaw -jar \"AppDir\\App.jar\" %s", parmStr);
// Create and initialized startup-info structure for use with CreateProcess call
STARTUPINFO startInfo;
ZeroMemory(&startInfo, sizeof(startInfo));
startInfo.wShowWindow = SW_NORMAL;
startInfo.dwFlags = STARTF_USESHOWWINDOW;
startInfo.cb = sizeof(startInfo);
PROCESS_INFORMATION procInfo;
ZeroMemory(&procInfo, sizeof(procInfo));
if (!CreateProcess(NULL, cmdStr, NULL, NULL, FALSE, 0, NULL, NULL, &startInfo, &procInfo))
{
MessageBox(dialogOwner, "Create Process Error", "Application not instantiated", MB_OK);
}
根據MSDN的文學,設置wShowWindow標誌SW_NORMAL和dwFlags中到STARTF_USESHOWWINDOW應該做的伎倆,但有些我已經在這個閱讀的意見和其他論壇暗示有時候這些標誌會被忽略(例如,用於控制檯應用程序),所以我想知道這是否是這種情況。爲了記錄,在這之前,我已經遇到了這個問題,然後它自行消失了,現在我修改了一些代碼後又回來了。但是我之前沒有在startupinfo結構中設置任何標誌,所以我希望通過這樣做來實現行爲的一致性。任何提示或指針,將不勝感激......
謝爾頓R.
您是使用AWT還是Swing來顯示窗口?如果是這樣,'JFrame#setState()'是你正在尋找的。 – 2012-02-13 17:48:47
我還沒有試過你的建議,Jim,因爲我一直在C++方面玩耍。我所看到的是,如果在執行CreateProcess調用之前添加一個MessageBoxA調用來顯示一些調試信息,那麼該窗口就會很好,而不是被最小化。在C++世界中有沒有一種方法可以驅除機器中的這個鬼魂? – 2012-02-13 20:17:12
更新:我編輯我的問題,包括顯示CreateProcess調用的代碼,以及我將startupinfo.cb設置爲該結構的大小的語句,因爲我在讀取另一個重要的問題的評論中。此外,我發現使用命令「java」而不是「javaw」(顯示控制檯輸出的命令窗口)也會導致顯示應用程序窗口而不是最小化。有關我的代碼的C++部分可能會丟失什麼的想法? – 2012-02-13 21:39:15