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上了解相关信息。