【问题标题】:Running Windows console app silently (suppress console from appearing)静默运行 Windows 控制台应用程序(禁止控制台出现)
【发布时间】:2015-03-04 13:10:15
【问题描述】:

我看过这些解决类似问题的帖子:From PythonExtract SilentlyCommand Line Option

没有解决我的具体问题。

我想在一个用 ANSI C 编写的应用程序中调用 7za.exe(可能还有其他 console 应用程序,默认情况下会在 shell 命令窗口中生成)没有为每个调用弹出 shell 提示窗口。在 Windows 命令 shell 中,我可以将 > nul 附加到 7za 的命令行调用的末尾,它会抑制所有内容,如下所示:

但是,我需要从 Windows 应用程序循环调用它(数百次),导致 Windows 启动 shell 时不断闪烁,然后在命令完成时将其杀死。

到目前为止,我已经尝试附加> nul,就像我在上面的命令提示符图像中说明的那样,然后使用system() 命令,以及在另一个进程中启动exe 的修改后的系统命令:

sprintf(command, "7za.exe x -y -o%s %s > nul", filepathUnComp, filepath); 
system(command);  

或:

SystemX(command);  

在哪里定义了 SystemX:

int SystemX(command)
{
    STARTUPINFO sj;
    PROCESS_INFORMATION pj;
    int exit;

    ZeroMemory( &sj, sizeof(sj) );
    sj.cb = sizeof(sj);
    ZeroMemory( &pj, sizeof(pj) );

    if(CreateProcess(NULL, cmd, NULL, NULL, FALSE, 0, NULL, NULL, &sj, &pj) == 0)
    {
        //AED_GetErrorMessage(AEDNV_FAILED_CREATE_PROCESS,cmd);
        return -1;
    }

    // Wait until child processes exit.
    WaitForSingleObject( pj.hProcess, IGNORE ); //ingnore signal

    //Get exit code
    GetExitCodeProcess(pj.hProcess, (LPDWORD)(&exit));

    return exit;
}  

这两种方法都会导致 shell 提示窗口闪烁。

有没有办法在应用程序中完全静默运行7za.exe,即不实例化shell 命令窗口闪烁?

如果使用 7za 无法做到这一点,我也愿意听取其他方法。

【问题讨论】:

  • 不,这是不可能的。您正在启动一个外壳程序,它必须启动窗口。 > nul 不会“隐藏”那个窗口。一个窗口不是程序的“输出”,它是程序输出的地方,如果你没有将它重定向到 nul。
  • @MarcB 您知道除 7za(或类似)以外的方法吗?我对完全不同的方法持开放态度,而不是局限于使用 7za。
  • 相关:stackoverflow.com/questions/12010103/…,但 start 本身将在 shell 中运行并导致创建自己的窗口。基本上你必须绑定到 windows api 来启动没有窗口的后台进程。
  • 如果你环顾四周,我相信你会发现一些 appropriate CreateProcess flag 可以用来告诉 CreateProcess 不要创建任何控制台窗口。
  • @JoachimPileborg - 我认为您的链接显示了一些可能性。谢谢

标签: c windows-7


【解决方案1】:

这可能对其他需要在运行默认启动 shell 的可执行程序时禁止显示 shell 提示的 Windows 程序员有用:(感谢 @Marc B 和 @Joachim Pileborg)

将 OP SystemX 代码中的原行更改为:

 if(CreateProcess(NULL, cmd, NULL, NULL, FALSE, 0, NULL, NULL, &sj, &pj) == 0);  

到:

 if(CreateProcess(NULL, cmd, NULL, NULL, FALSE, CREATE_NO_WINDOW, NULL, NULL, &sj, &pj) == 0); 

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-01-22
    • 2013-02-11
    • 1970-01-01
    • 2010-11-17
    • 2010-11-19
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多