フロントエンドとして機能するアプリケーションのコーディングに忙しかったです。GUIにはボタンなどのコマンドラインオプションがあり、コマンドライン.exeに渡しています。アプリケーションのコンソールを使用して、コマンドラインアプリの出力を表示します。 これはうまくいきますが、Ctrl + Cを使うときやコンソールウィンドウを閉じるときにGUIが閉じてしまいます。ただし、ファイルをバッチ処理するため、すべてのファイルが自身のコンソールにポップアップするので、独自のコンソールでプログラム出力を行うことはできません。ConsoleCancelEventHandlerを何度も使用する方法
プログラムはC++でMSVC 2012で書かれ、.NETを使用します。私はそれを(コマンドラインアプリを停止するが、GUIではなく)したいが、少なくともCtrl + Cの動作を得るためにコンソール:: CancelKeyPressを試みたが、これといくつかの問題を抱えている。
私のコード
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()が使用されます。しかし、これをもう一度やろうとすると、GUIも終了します。私は前のイベントに
Console::CancelKeyPress -=
gcnew ConsoleCancelEventHandler(this, &Form1::OnCancelKeyPressed);
を削除するには、新しいイベントを追加する前にこれを追加しようとしましたが、何とかそれは、ハンドラを追加することで、エラーを発生させますが、唯一の二回目:タイプの未処理の例外「System.IO.IOException 'mscorlib.dllで発生しました。追加情報:Deパラメータはonjuistです。
最後の部分は「間違った引数」のためにオランダ語であり、デバッガはConsoleCancelEventHandlerを読み上げることに挑戦すると言います。
フォームのロード時にイベントハンドラを追加するだけでイベントハンドラを追加しようとすると、何もしません。
ここでは何が起こっていますか?
コンソールはGUIと同じプロセスコンテキストで実行されます。したがって、問題やキャッチされない例外がアプリケーション全体を終了させます。だからこそ、GUIが閉じられるのを見るのです。コード全体を投稿できますか?また、1つの解決策は、GUIアプリケーションが予期せず閉じられるのに影響しない、すべてのバッチファイル用に新しいプロセスを生成することです。 –