如何在旧版Windows终端中以编程方式启动进程?

4
我的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);
    }
}

1
定义“旧”和“新”的Windows终端。这是Windows 11的事情吗? - paddy
1
@paddy https://www.ghacks.net/2021/12/17/command-prompt-to-be-replaced-by-windows-terminal-in-windows-11/ - Alex
1个回答

3

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

所以,在你的情况下,尝试在你的 cmdWStr 前加上 conhost.exe --


我需要指出的是,寻找ENABLE_VIRTUAL_TERMINAL_PROCESSING并不能严格告诉你一个命令行应用程序是否在终端中运行(而不是conhost)。任何命令行应用程序都可以设置它(我相信pwsh.exe默认情况下即使在终端之外也会这样做)。也没有环境变量可以检查您是否在终端中(因为终端并不总是有机会设置这样的变量)。

如果您在终端中遇到了复杂的问题,团队很乐意在https://github.com/microsoft/terminal上听取您的意见。


1
很不幸,尝试在我的应用程序中启动conhost.exe会导致Windows标记我的程序为病毒并禁用它。 - Alex
1
这非常有用。我用它来启动多个微型编辑器实例,而无需为每个实例都打开一个cmd.exe窗口。有没有办法控制窗口的大小?我觉得https://learn.microsoft.com/en-us/windows/console/definitions并没有提供帮助。 - Questaware
有一些其他的请求来确定是否在新的Windows终端中运行,建议检查WT_SESSION环境变量。我注意到这并不是百分之百可靠的,因为它可能是由后来生成您的非wt应用程序的Windows终端会话设置的。(当然,由于可能存在的许多潜在问题,目前他们建议不要这样做,https://github.com/Textualize/rich/issues/140,但普遍适用的替代方案仍然缺乏) - undefined

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接