1

我想要的是:

一个应用程序,其中有一个 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 之类的东西,我将能够输入一行 - 但与窗口的交互将停止,直到输入完成。那是对的吗?我怎样才能使应用程序以我上面描述的方式运行?

更新:

我发现了相关问题:测试标准输入是否有 C++ 输入(windows 和/或 linux)

确定控制台输入中是否有字符的代码如下:

bool StdinOpen() {
  static HANDLE handle = GetStdHandle(STD_INPUT_HANDLE);
  DWORD bytes_left;
  PeekNamedPipe(handle, NULL, 0, NULL, &bytes_left, NULL);
  return bytes_left;
}

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

4

1 回答 1

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;
}
于 2013-02-05T17:44:02.020 回答