【发布时间】:2012-02-13 17:30:08
【问题描述】:
我在 C++ 程序中使用 CreateProcess 调用来执行运行 Java Swing GUI 应用程序的 JAR 文件。一切正常,除了 Java 应用程序开始最小化并且我希望它从显示的窗口开始。下面是相关代码sn-p:
// 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()就是您要查找的内容。 -
我还没有尝试过你的建议,Jim,因为我仍然在玩 C++ 方面。我所看到的是,如果我在执行 CreateProcess 调用之前添加一个 MessageBoxA 调用来显示一些调试信息,那么窗口就会很好地出现,而不是被最小化。 C++ 世界有没有办法驱除机器中的这个幽灵?
-
更新:我编辑了我的问题以包含显示 CreateProcess 调用的代码,以及我将 startupinfo.cb 设置为结构大小的语句,因为我在另一个问题的评论中读到那很重要。此外,我发现使用命令“java”而不是“javaw”(显示控制台输出的命令窗口)也会导致显示应用程序窗口而不是最小化。关于我的代码的 C++ 部分中可能缺少的内容有什么想法吗?
-
更新 #2:我向我的 Java 应用程序添加了代码以从 JFrame 获取状态并在状态栏中显示一条消息。有两种方法可以访问启动 Java 应用程序的 CreateProcess 语句,目前,一种方法显示应用程序窗口,另一种方法将其最小化。在这两种情况下,帧状态都报告为 NORMAL...
标签: java c++ jar createprocess showwindow