在旧的 Windows 终端中以编程方式启动进程?

Ale*_*lex 5 c++ windows cmd windows-terminal

我的 C++ 应用程序需要打开和关闭终端窗口以及复杂的终端操作。它在带有选项卡系统的新 Windows 终端中不起作用。我不想强迫用户更改默认终端只是为了运行我的应用程序。我有代码来检查我的应用程序是否位于新终端中,如果是,我想在旧终端中启动一个新副本,然后退出当前终端。不幸的是 cmd.exe 仍然启动新终端。如何使用旧的 Windows 终端启动应用程序?

void StartInOldTerminal() {
    // Get path of current executable
    wchar_t exePath[MAX_PATH];
    if (GetModuleFileName(NULL, exePath, MAX_PATH) == 0) {
        // Failed to get executable path, handle error
        std::cerr << "Failed to get executable path\n";
        exit(1);
    }

    // Check if running in the new Windows Terminal
    DWORD consoleMode;
    if (GetConsoleMode(GetStdHandle(STD_OUTPUT_HANDLE), &consoleMode) == 0) {
        // Failed to get console mode, handle error
        std::cerr << "Failed to get console mode\n";
        exit(1);
    }

    if ((consoleMode & ENABLE_VIRTUAL_TERMINAL_PROCESSING) != 0) {
        std::wstring cmdWStr = L"cmd.exe /k \"" + std::wstring(exePath) + L"\""; //Still starts in new terminal
        std::string cmdStr = Text::wstring_to_utf8(cmdWStr);
        system(cmdStr.c_str());
        exit(0);
    }
}
Run Code Online (Sandbox Code Playgroud)

小智 3

这是一个秘密 - 您可以使用命令行手动启动老式控制台conhost.exe。默认情况下,它会生成一个cmd.exe实例在其中运行,但您也可以通过执行 来告诉它启动其他东西conhost.exe -- powershell.exe

因此,就您的情况而言,请尝试conhost.exe -- 在您的cmdWStr.


但我要注意的是,查找ENABLE_VIRTUAL_TERMINAL_PROCESSING并不会严格告诉您命令行应用程序正在终端中运行(与 conhost 相比)。任何命令行应用程序都可以设置它(我相信pwsh.exe默认情况下,即使在终端之外也是如此)。也没有环境变量来检查您是否在终端中(因为终端并不总是有机会设置这样的变量)。

如果您确实有一个无法在终端中运行的复杂场景,团队很乐意在https://github.com/microsoft/terminal上了解相关信息。