在gui应用程序中进行交互式控制台/窗口交互

时间:2013-01-14 09:21:31

标签: c++ winforms

我想要的是什么:

一个应用程序,其中有一个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;
}

然而,它会返回一些过高的数字,就好像控制台中总有输入一样。

1 个答案:

答案 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;
}