私は、フロントエンドとして機能するアプリケーションのコーディングに忙しくしています。このアプリケーションには、コマンド ライン オプションをボタンなどで取得し、それらをコマンド ライン .exe に渡す GUI があります。アプリケーションのコンソールを使用して、コマンド ライン アプリの出力を表示します。これは問題なく動作しますが、Ctrl+C を使用するか、コンソール ウィンドウを閉じようとすると、GUI も閉じてしまいます。ただし、プログラムがファイルをバッチ処理し、すべてのファイルが独自のコンソールをポップアップするため、プログラムが独自のコンソールで出力できるようにすることはできません。
プログラムは MSVC 2012 を使用して C++ で記述され、.NET を使用します。Console::CancelKeyPress を試して、少なくとも Ctrl+C が希望どおりに動作するようにしました (コマンドライン アプリは停止しますが、GUI は停止しません) が、これには問題があります。
私のコード
private: System::Void OnCancelKeyPressed(System::Object^ sender, System::ConsoleCancelEventArgs^ e) {
e->Cancel = true;
}
private: System::Void GetConsoleReady() {
COORD c;
FreeConsole();
AllocConsole();
c.X = 80; c.Y = 8000;
SetConsoleScreenBufferSize(GetStdHandle(STD_OUTPUT_HANDLE),c);
Console::Clear();
Console::TreatControlCAsInput = false;
Console::CancelKeyPress +=
gcnew ConsoleCancelEventHandler(this, &Form1::OnCancelKeyPressed);
}
これは、ユーザーが処理するファイルのバッチを実行しようとするたびに呼び出されます。バッチを実行した後、コンソールは FreeConsole() で解放されます。最初はうまく機能し、Ctrl+C を使用するとコマンド ライン アプリが強制終了されますが、GUI での処理は続行され、他のコマンドが実行され、最後に FreeConsole() が使用されます。ただし、これを 2 度目に実行しようとすると、GUI も強制終了されます。新しいイベントを追加して前のイベントを削除する前に、これを追加しようとしました
Console::CancelKeyPress -=
gcnew ConsoleCancelEventHandler(this, &Form1::OnCancelKeyPressed);
しかし、どういうわけか、ハンドラーの追加時にエラーが発生しますが、2 回目のみ: mscorlib.dll で「System.IO.IOException」型の未処理の例外が発生しました。追加情報: De パラメータは onjuist です。
最後の部分はオランダ語で「間違った引数」を意味し、デバッガーは、ConsoleCancelEventHandler の読み取り時にチョークすると言います。
フォームの読み込み時にイベント ハンドラを 1 回だけ追加しようとしても、何もしません。
ここで何が起こっているのですか?