我想要的是什么:
一个应用程序,其中有一个gui窗口和控制台窗口。可以单击,拖动窗口等等。在任何给定时刻,都可以选择控制台,并输入一条将被处理的线路。
我已经拥有的东西:
一个应用程序,它为自己分配和附加控制台,然后将标准流重定向到它。代码是:
AllocConsole() ;
AttachConsole( GetCurrentProcessId());
freopen("CONIN$","rb",stdin); // reopen stdin handle as console window input
freopen("CONOUT$","wb",stdout); // reopen stout handle as console window output
freopen("CONOUT$","wb",stderr); // reopen stderr handle as console window output
然后注册窗口类,创建并显示一个窗口。输出到控制台工作正常,与窗口的交互是正确的。
但是,我无法在控制台中输入任何内容。我可以猜一下:如果我打电话给std :: cin>> my_string,我将能够输入一行 - 但与窗口的交互将停止,直到输入完成。那是对的吗?如何使应用程序以我上面描述的方式运行?
更新
我找到了相关问题:Test if stdin has input for C++ (windows and/or linux)
确定控制台输入中是否有字符的代码如下:
bool StdinOpen() {
static HANDLE handle = GetStdHandle(STD_INPUT_HANDLE);
DWORD bytes_left;
PeekNamedPipe(handle, NULL, 0, NULL, &bytes_left, NULL);
return bytes_left;
}
然而,它会返回一些过高的数字,就好像控制台中总有输入一样。
答案 0 :(得分:0)
我首先初始化bytes_left
变量并检查返回值。
bool StdinOpen() {
static HANDLE handle = GetStdHandle(STD_INPUT_HANDLE);
DWORD bytes_left = 0;
if (!PeekNamedPipe(handle, NULL, 0, NULL, &bytes_left, NULL))
return false;
return bytes_left != 0;
}