.NET TIPS

コンソール・アプリケーションで[閉じる]ボタンを無効にするには?[C#、VB]

デジタルアドバンテージ 遠藤 孝信
2009/07/02

 「TIPS:コンソール・アプリケーションの強制終了時に処理を行うには?」では、[Ctrl]+[C]キーが押されてアプリケーションが強制終了されるときにもアプリケーションの後処理を実行可能にするため、CancelKeyPressイベントを利用する方法について紹介している。

 しかし、コマンド・プロンプトでコンソール・アプリケーションが実行されている場合、[Ctrl]+[C]キーが押される以外にも、ウィンドウ右上隅にある[×]ボタン([閉じる]ボタン)によりアプリケーションが強制終了される可能性がある。このような状況を回避する1つの手段としては、あらかじめ[×]ボタンを無効化しておくという方法がある。

Win32 APIによる[×]ボタンの無効化

 Windowsフォーム・アプリケーションにおける[×]ボタンの無効化方法としては、「TIPS:タイトル・バーの[閉じる]ボタンのみを無効にするには?」にて、Win32 APIであるGetSystemMenu関数とRemoveMenu関数を利用した方法を紹介しているが、基本的には同じ手順がコンソール・アプリケーションにも有効だ。

 ただし、GetSystemMenu関数の第1引数に指定しなければならないウィンドウ・ハンドルの取得方法がWindowsフォーム・アプリケーションとコンソール・アプリケーションでは異なる(GetSystemMenu関数の詳細については、元のTIPSを参照してほしい)。

 コンソール・アプリケーションが実行されているコマンド・プロンプトのウィンドウ・ハンドルは、Processクラス(System.Diagnostics名前空間)のGetCurrentProcessメソッドによりアプリケーションのProcessオブジェクトを取得し、そのMainWindowHandleプロパティから取得できる。以下は、この手順により[×]ボタンを無効にするコンソール・アプリケーションの記述例だ。

using System;
using System.Runtime.InteropServices;
using System.Diagnostics;

public class Form1 {

  // Win32 APIのインポート
  [DllImport("USER32.DLL")]
  private static extern IntPtr
    GetSystemMenu(IntPtr hWnd, UInt32 bRevert);

  [DllImport("USER32.DLL")]
  private static extern UInt32
    RemoveMenu(IntPtr hMenu, UInt32 nPosition, UInt32 wFlags);

  // [閉じる]ボタンを無効化するための値
  private const UInt32 SC_CLOSE = 0x0000F060;
  private const UInt32 MF_BYCOMMAND = 0x00000000;

  public static void DisableCloseButton() {

    IntPtr hWnd = Process.GetCurrentProcess().MainWindowHandle;

    if (hWnd != IntPtr.Zero) {
      // [閉じる]ボタンの無効化
      IntPtr hMenu = GetSystemMenu(hWnd, 0);
      RemoveMenu(hMenu, SC_CLOSE, MF_BYCOMMAND);
    }
  }

  static void Main() {

    DisableCloseButton();

    Console.WriteLine("[×]ボタンを無効にしました");
    Console.ReadLine(); // 何かキーが押されるのを待つ
  }
}
Imports System
Imports System.Runtime.InteropServices
Imports System.Diagnostics

Class Program

  ' Win32 APIのインポート
  <DllImport("USER32.DLL")> _
  Public Shared Function GetSystemMenu( _
    ByVal hWnd As IntPtr, ByVal bRevert As UInt32) As IntPtr
  End Function

  <DllImport("USER32.DLL")> _
  Public Shared Function RemoveMenu( _
    ByVal hMenu As IntPtr, ByVal nPosition As UInt32, _
    ByVal wFlags As UInt32) As UInt32
  End Function

  ' [閉じる]ボタンを無効化するための値
  Const MF_BYCOMMAND As UInt32 = 0
  Const SC_CLOSE As UInt32 = &HF060

  Public Shared Sub DisableCloseButton()

    Dim hWnd As IntPtr = Process.GetCurrentProcess.MainWindowHandle

    If hWnd <> IntPtr.Zero Then
      Dim hMenu As IntPtr = GetSystemMenu(hWnd, 0)
      RemoveMenu(hMenu, SC_CLOSE, MF_BYCOMMAND)
    End If
  End Sub

  Shared Sub Main()

    DisableCloseButton()

    Console.WriteLine("[×]ボタンを無効にしました")
    Console.ReadLine() ' 何かキーが押されるのを待つ
  End Sub

End Class
[×]ボタンを無効にするコンソール・アプリケーション(上:C#、下:VB)

 以下は、このサンプル・プログラムを実行したときの画面である。


サンプル・プログラムの実行画面

 ウィンドウ右上隅の[×]ボタンが無効化されているのを確認できる。End of Article

カテゴリ:コンソール・アプリケーション 処理対象:画面
カテゴリ:クラス・ライブラリ 処理対象:Win32 API
使用ライブラリ:DllImport属性(System.Runtime.InteropServices名前空間)
使用ライブラリ:Processクラス(System.Diagnostics名前空間)
関連TIPS:コンソール・アプリケーションの強制終了時に処理を行うには?
関連TIPS:タイトル・バーの[閉じる]ボタンのみを無効にするには?

この記事と関連性の高い別の.NET TIPS
コンソール・アプリケーションの強制終了時に処理を行うには?(Win32編)
タイトル・バーの[閉じる]ボタンのみを無効にするには?
コンソール・アプリケーションの強制終了時に処理を行うには?
ほかのアプリを実行して終了コードを得るには?
コマンド・プロンプトを表示しないコンソール・アプリケーションを作成するには?
このリストは、(株)デジタルアドバンテージが開発した
自動関連記事探索システム Jigsaw(ジグソー) により自動抽出したものです。
generated by

「.NET TIPS」


Insider.NET フォーラム 新着記事
  • 第2回 簡潔なコーディングのために (2017/7/26)
     ラムダ式で記述できるメンバの増加、throw式、out変数、タプルなど、C# 7には以前よりもコードを簡潔に記述できるような機能が導入されている
  • 第1回 Visual Studio Codeデバッグの基礎知識 (2017/7/21)
     Node.jsプログラムをデバッグしながら、Visual Studio Codeに統合されているデバッグ機能の基本の「キ」をマスターしよう
  • 第1回 明瞭なコーディングのために (2017/7/19)
     C# 7で追加された新機能の中から、「数値リテラル構文の改善」と「ローカル関数」を紹介する。これらは分かりやすいコードを記述するのに使える
  • Presentation Translator (2017/7/18)
     Presentation TranslatorはPowerPoint用のアドイン。プレゼンテーション時の字幕の付加や、多言語での質疑応答、スライドの翻訳を行える
@ITメールマガジン 新着情報やスタッフのコラムがメールで届きます(無料)

注目のテーマ

Insider.NET 記事ランキング

本日 月間