フォームの[X]閉じるメニューを無効化する方法

[x] 閉じるボタンを無効化する方法を掲載します。MSDNで質問があったので、pinvoke.netのサンプルを元に自分で作成したサンプルを掲載します。

最小化メニューも無効化していますが、フォーラムの質問では最小化も無効化したいということでしたので、その名残です。×ボタンを無効化するのに必要というわけではありません。

Imports System.Runtime.InteropServices


Public Class Form1
    Private Shared MF_BYPOSITION As Int32 = &H400
    Private Shared MF_REMOVE As Int32 = &H1000
    Private Shared MF_GRAYED As Int32 = &H1
    Private Shared SC_CLOSE As Int32 = &HF060

    <DllImport("User32")> _
    Public Shared Function RemoveMenu(ByVal hMenu As IntPtr, ByVal uPosition As UInteger, ByVal uFlags As UInteger) As Boolean
    End Function

    <DllImport("User32")> _
    Public Shared Function GetSystemMenu(ByVal hWnd As IntPtr, ByVal bRevert As Boolean) As IntPtr
    End Function

    <DllImport("User32")> _
    Public Shared Function GetMenuItemCount(ByVal hWnd As IntPtr) As Integer
    End Function

    <DllImport("User32")> _
    Public Shared Function EnableMenuItem(ByVal hWnd As IntPtr, ByVal uIDEnableItem As UInteger, ByVal uEnable As UInteger) As Boolean
    End Function

    Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
        ' 最小化を不可にする
        Me.MinimizeBox = False

        ' X閉じるメニューを使用不可
        Dim hMenu As IntPtr = GetSystemMenu(Me.Handle, False)

        EnableMenuItem(hMenu, SC_CLOSE, MF_GRAYED)  '' Vista with Aero環境だと必要らしいが環境がないので、確認していません
        Dim menuItemCount As Integer = GetMenuItemCount(hMenu)
        RemoveMenu(hMenu, menuItemCount - 1, MF_BYPOSITION Or MF_REMOVE)
        ' なくてもOK
        'RemoveMenu(hMenu, menuItemCount - 2, MF_BYPOSITION Or MF_REMOVE)
    End Sub
End Class

個人のサイトでC#版を掲載しています。

閉じる(クローズ)ボタンを無効化する

カテゴリー: .NET パーマリンク

コメントを残す