运行 JAR 文件的 CreateProcess 以最小化窗口开始

Posted

技术标签:

【中文标题】运行 JAR 文件的 CreateProcess 以最小化窗口开始【英文标题】:CreateProcess for Running JAR File Starts with Window Minimized 【发布时间】: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... 【参考方案1】:

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

谢尔顿 R.

【讨论】:

【参考方案2】:

这是对我之前答案的更新:我必须根据上下文以两种不同的方式(即“java”或“javaw”)调用我的 java 小程序的原因,与 C++ 应用程序中的一个错误有关我称之为我的小程序。我之所以知道这是因为在解决我的问题几个月后,发布了该应用程序的更新版本,并且该版本没有底层错误,这实际上导致了我的小程序中的一个新错误,原因是“java”命令执行您所期望的操作,即除了小程序窗口之外还实例化一个控制台窗口,这让我的业务用户大吃一惊:)。因此,对于新的无错误版本的 C++ 应用程序,我使用“javaw”命令调用我的小程序,无论是否首先实例化对话框以使用户能够输入登录凭据...

谢尔顿

【讨论】:

以上是关于运行 JAR 文件的 CreateProcess 以最小化窗口开始的主要内容,如果未能解决你的问题,请参考以下文章

错误:无法运行程序“jar”:CreateProcess error=2,系统找不到指定的文件

使用 CreateProcess 运行批处理文件

使用 CreateProcess 运行游戏可执行文件

使用 createProcess() 运行批处理文件

CreateProcess 执行批处理文件

将项目转换为支持 Unicode 后,CreateProcess 不运行 .cmd 文件