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 のようなものを呼び出すと、行を入力できますが、ウィンドウとの対話は入力が完了するまで停止します。あれは正しいですか?上記の方法でアプリケーションを動作させるにはどうすればよいですか?

アップデート:

関連する質問を見つけました: stdin に 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 に答える