AttachConsole
只是附加到父进程的控制台,它不会阻止父进程也从中读取。因此控制台输入在父进程之间交错(cmd.exe
)和你的应用程序,这可能会带来管理问题(有些人建议killing https://stackoverflow.com/questions/5629393/using-attachconsole-while-the-process-ive-attached-with-is-running-and-spewing父进程,这显然不是一个好主意)。
相反,你可以做的是始终创建一个new控制台(参见AllocConsole https://learn.microsoft.com/en-us/windows/console/allocconsole).
或者如果您想重新使用same控制台,以控制台子系统为目标可能是一个想法(链接器选项/SUBSYSTEM:CONSOLE
)并有规律的main()
函数而不是WinMain
(是的,您可以创建 Win32 窗口and处理控制台 I/O 全部在内部main()
).
您甚至可以拥有一个可以像 Windows 一样链接的多子系统源以及具有这样的垫片的控制台子系统(nCmdShow
并且命令行参数仍有待实现):
HWND hwnd;
int main() {
std::thread t([] {
// let GUI run in its own thread ...
WinMain(GetModuleHandle(NULL), NULL, "", SW_SHOWDEFAULT);
exit(0);
});
// meanwhile in this thread we handle console I/O ...
std::string s;
std::cout << "Press Enter to exit" << std::endl;
while (std::getline(std::cin, s)) {
if (s == "")
break;
std::cout << "Hello " << s << std::endl;
}
PostMessageA(hwnd, WM_CLOSE, 0, 0);
t.join();
}
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow)
{
// Your normal WinMain.
// CreateWindow, GetMessage loop etc. . .