2012-02-13 170 views
0

我在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.

+0

您是使用AWT还是Swing来显示窗口?如果是这样,'JFrame#setState()'是你正在寻找的。 – 2012-02-13 17:48:47

+0

我还没有试过你的建议,Jim,因为我一直在C++方面玩耍。我所看到的是,如果在执行CreateProcess调用之前添加一个MessageBoxA调用来显示一些调试信息,那么该窗口就会很好,而不是被最小化。在C++世界中有没有一种方法可以驱除机器中的这个鬼魂? – 2012-02-13 20:17:12

+0

更新:我编辑我的问题,包括显示CreateProcess调用的代码,以及我将startupinfo.cb设置为该结构的大小的语句,因为我在读取另一个重要的问题的评论中。此外,我发现使用命令“java”而不是“javaw”(显示控制台输出的命令窗口)也会导致显示应用程序窗口而不是最小化。有关我的代码的C++部分可能会丢失什么的想法? – 2012-02-13 21:39:15

回答

0

这是一个更新到我以前的答案:我之所以不得不打电话我的Java小程序有两种不同的方式(即“java”或“javaw”),这取决于上下文,这与我从中调用我的小程序的C++应用程序中的错误有关。我知道这是因为在解决我的问题几个月后,这个应用程序的更新版本发布了,这个版本没有基本的错误,这实际上导致了我的applet中的一个新的错误,由于“java”命令做你期望的事情,即除了applet窗口之外还实例化一个控制台窗口,这对我的业务用户来说是意外的:)。因此,对于C++应用程序的新无bug版本,我使用“javaw”命令调用我的小程序,而不管是否首先实例化对话框以使用户能够输入登录凭证...

Sheldon

0

好吧,我一直在努力解决我的问题,我终于可以谈论它,因为它似乎是工作:)我打电话给我的Java应用程序以下两种方式之一:通过首先弹出一个对话框来收集登录凭据,或通过直接使用保存的凭据调用应用程序。对于登录对话框的情况,我使用参数“javaw ...”调用CreateProcess,而保存的凭证情况似乎需要“java ...”以避免应用程序启动时最小化。除了参数字符串的区别之外,关于CreateProcess调用的所有其他内容都是相同的。我不知道为什么我会在一个案例中使用“java”,而在另一个案例中使用“javaw”,但由于它的工作原理,我不会质疑它:)但是,当然,如果有人想要就这个问题进行启发,我很乐意学习更多。由于@Jim驻军的建议,即使是不能最终解决我的问题......

谢尔顿R.