我要做很多system()命令行操作windows c++ MFC项目,弹出黑框,有没有办法抑制呢?

Posted

技术标签:

【中文标题】我要做很多system()命令行操作windows c++ MFC项目,弹出黑框,有没有办法抑制呢?【英文标题】:I have to do many system() command line operations windows c++ MFC project, black boxes pop up, is there a way to suppress them? 【发布时间】:2012-05-25 05:47:06 【问题描述】:

我正在为 Windows (7) 编写一个应用程序,它必须运行许多只能使用系统调用才能完成的“dos 风格”命令行程序。当我运行系统调用时,大黑框弹出然后消失。 . 它使执行看起来超级草率而且慢得多(我喜欢其中的 25 个,而且看起来很糟糕) 我想将它们完全从屏幕上隐藏起来并让它们运行......有没有办法做到这一点?我已经翻遍了,我找不到任何关于这个的..

谢谢!

【问题讨论】:

【参考方案1】:

您可以使用ShellExecute 并指定SW_HIDE,而不是system。或者,您可以使用CreateProcess 并指定DETACHED_PROCESS。下面是一段演示代码,用于创建您在命令行中指定的可执行文件的分离进程:

#define WIN32_LEAN_AND_MEAN
#include <windows.h>

#include <stdio.h>

void system_error(char *name) 
// Retrieve, format, and print out a message from the last error.
// The `name' that's passed should be in the form of a present tense
// noun (phrase) such as "opening file".
//
    char *ptr = NULL;
    FormatMessage( FORMAT_MESSAGE_ALLOCATE_BUFFER |
        FORMAT_MESSAGE_FROM_SYSTEM,
        0, GetLastError(), 0, (char *)&ptr, 1024, NULL);

    printf("\nError %s: %s\n", name, ptr);
    LocalFree(ptr);


PROCESS_INFORMATION p;

BOOL WINAPI die(DWORD reason) 
    TerminateProcess(p.hProcess, 1);
    return TRUE;


int main(int argc, char **argv) 

    STARTUPINFO s;

    memset(&s, 0, sizeof s);
    s.cb = sizeof(s);

    if (!CreateProcess(argv[1], argv[2], NULL, NULL, TRUE,
        DETACHED_PROCESS, NULL, NULL, &s, &p))
    
        system_error("Spawning program");
        return 1;
    

    SetConsoleCtrlHandler(die, TRUE);

    WaitForSingleObject(p.hProcess, INFINITE);
    return 0;

【讨论】:

我没想过要寻找除了system()之外的其他机制。我会试试这些!刚刚查找了 shellexecute,它可能几乎是一个替代品(而且我发现它比系统调用提供更好的回报)谢谢!【参考方案2】:

如果您在这些命令行完成的任务之间存在依赖关系,则最好使用 CreateProcess 或 ShellExecuteEx,因为它们将允许您在结果进程句柄上使用 WaitForSingleObject,如 here 所述。因此,您可以等待一项任务完成,然后再开始下一项。

【讨论】:

以上是关于我要做很多system()命令行操作windows c++ MFC项目,弹出黑框,有没有办法抑制呢?的主要内容,如果未能解决你的问题,请参考以下文章

在python交互命令行中如何清屏

DOS复制命令

python执行命令行操作

Windows下如何通过CMD命令行获取串口名称?

如何使用 Windows 命令行更改目录

命令行操作mysql