C#で閉じられていないアプリケーションを作成するには? フォームの「X」ボタンを無効にして、Windows タスク マネージャーがフォームを閉じないようにしたいです。
フォームが閉じないようにする 1 つの方法は、FormClosing
イベントを処理することですが、タスク マネージャーがフォームを閉じないようにするにはどうすればよいでしょうか?
C#で閉じられていないアプリケーションを作成するには? フォームの「X」ボタンを無効にして、Windows タスク マネージャーがフォームを閉じないようにしたいです。
フォームが閉じないようにする 1 つの方法は、FormClosing
イベントを処理することですが、タスク マネージャーがフォームを閉じないようにするにはどうすればよいでしょうか?
いいえ、タスク マネージャーがアプリケーションを閉じないようにすることはできません。タスク マネージャーは、応答していないプロセスを強制的に終了できます。それを閉じるのにアプリケーションの許可は必要ありませんし、適切に尋ねることもありません。(タスク マネージャーの詳細と、アプリケーションを閉じるさまざまな方法の比較については、この回答を参照してください。)
考えられる唯一の回避策は、2 つのプロセスを用意し、それぞれがもう一方のプロセスが閉じられたことを検出して新しいインスタンスを起動するように構成することです。もちろん、これでもプロセスの 1 つが強制終了されるのを止めることはできません。プロセスを再起動できるようにするだけです。そして、これはおそらくユーザー敵対行為のカテゴリーに分類されます。タスク マネージャーを使用してアプリを閉じた場合、プログラマーとしての意図に関係なく、アプリを削除したいと思うでしょう。そして、それが新しいプロセスを起動し続けるなら、私は間違いなく気が狂います (また、私のウイルス スキャナーも狂っている可能性があります。これは、以前にこの種の動作が見られたためです)。
アプリケーションの設計を再検討することをお勧めします。バックグラウンドで常に実行するものが必要な場合は、Windows サービスを作成する必要があります。もちろん、サービスにはユーザー インターフェイスがなく、アプリケーションにはユーザー インターフェイスが必要なようです。できれば、防御的にコードを記述してください。アプリケーションの状態を保存して、自由に閉じて復元できるようにします。いずれにせよ、コンピューターがシャットダウンするケースを処理する必要があるため、アプリのシャットダウンだけを処理するのはどれくらい難しいでしょうか?
Microsoft のRaymond Chenが言うように、Windows にはこのためのメカニズムがありません。なぜなら、あなたのアプリのように素晴らしいアプリがあり、ユーザーが閉じたがらないとは誰も想像できなかったからです。
Altフォームのクローズ ボックス、システム/ウィンドウ メニューの閉じるアイコン、および+キーストロークを無効にする限りF4、これは比較的簡単です。CreateParams
フォームのプロパティをオーバーライドし、CS_NOCLOSE
ウィンドウ クラスのスタイルを設定する必要があります。
protected override CreateParams CreateParams
{
get
{
const int CS_NOCLOSE = 0x200;
CreateParams cp = base.CreateParams;
cp.ClassStyle |= CS_NOCLOSE;
return cp;
}
}
コンパイルして実行します。次のようなフォームが表示されます (タイトルバーの [閉じる] ボタンが無効になっていることと、システム/ウィンドウ メニューに [閉じる] メニュー項目がないことに注意してください):
これを行うときは、フォームを閉じるための代替メカニズムをアプリケーションのインターフェース内に実際に提供する必要があることに注意してください。たとえば、このダイアログが表示された「マスター」フォームで。
このようなことは決してすべきではありませんが、本当にこれが必要な場合は、サービスを作成する必要があります。
これは質問に対する答えではありませんが、ユーザーが終了するために本当に長い時間を費やさなければならないアプリケーションを作成することが常に無効であるとは限らないことを指摘することは重要かもしれません. 会社が所有するマシン上で実行するように設計され、アプリを使用して従業員としての仕事を行う会社の従業員によって操作される内部プライベート アプリケーションの場合、アプリを常に実行し続けることを強制することは完全に正当です。 . @TvmMurthyの質問は、まさにこの状況を扱っているようです。
私自身の仕事では、MS Outlook はワークステーションのスタートアップ アプリの 1 つとして起動され、マシンを再起動するまで 1 日中実行したままにします。また、一部のサーバーで監視を担当しているプロセスのステータスを常に通知する Windows フォーム アプリも作成しました。私はこれらのアプリを常に実行し続け、知る必要のある何かが検出されたときにのみポップアップとして現れるようにこれらのアプリを作成しました (邪魔にならないようにツールバーに最小化します)。シャープリーダーを使っています私の RSS フィードに遅れずについていくために、それは自然に常に実行されるように設計されています。赤い X をクリックしても、ツールバーに最小化され、ツールバーのコンテキスト メニューまたはタスク マネージャーを使用して終了することができます。
開発者は、すべてのアプリケーションがユーザーによって自発的にインストールされ、使用されていると仮定してはなりません。ユーザーは、好きなときに好きなときに好きなソフトウェアを自由に実行できます。また、自分の好みが業界や他のユーザーを支配していると仮定するべきではありません。アプリケーションの動作を管理するのはビジネス要件であり、開発者の偏見ではありません。業界で働く開発者として、自分でソフトウェアを書いていたら書かなかったであろう多くの動作をソフトウェアに書き込む必要がありました。
ユーザーが自分のアプリケーションに明確に設計するように指示されたものが気に入らないという理由で質問に反対票を投じることは、特に賞賛に値しない一種の狭量または狭量さを示します。これに対抗するための賛成の質問。