Private Sub UserForm_QueryClose(Cancel As Integer, CloseMode As Integer)
' CloseModeが0の場合は「×」ボタンがクリックされたことを意味する
If CloseMode = 0 Then
MsgBox "このフォームは「×」ボタンで閉じることはできません。", vbExclamation, "警告"
Cancel = True ' フォームの閉じる動作をキャンセル
End If
End Sub
Private Declare PtrSafe Function GetSystemMenu Lib "user32" (ByVal hWnd As LongPtr, ByVal bRevert As Long) As LongPtr
Private Declare PtrSafe Function RemoveMenu Lib "user32" (ByVal hMenu As LongPtr, ByVal nPosition As Long, ByVal wFlags As Long) As Long
Private Const MF_BYCOMMAND As Long = &H0&
Private Const SC_CLOSE As Long = &HF060&
Private Sub UserForm_Initialize()
Dim hMenu As LongPtr
Dim hWnd As LongPtr
' フォームのウィンドウハンドルを取得
hWnd = FindWindow("ThunderDFrame", Me.Caption)
' システムメニューのハンドルを取得
hMenu = GetSystemMenu(hWnd, 0)
' システムメニューから「閉じる」ボタンを削除
Call RemoveMenu(hMenu, SC_CLOSE, MF_BYCOMMAND)
End Sub
コードの全体
Private Declare PtrSafe Function GetSystemMenu Lib "user32" (ByVal hWnd As LongPtr, ByVal bRevert As Long) As LongPtr
Private Declare PtrSafe Function RemoveMenu Lib "user32" (ByVal hMenu As LongPtr, ByVal nPosition As Long, ByVal wFlags As Long) As Long
Private Declare PtrSafe Function FindWindow Lib "user32" Alias "FindWindowA" (ByVal lpClassName As String, ByVal lpWindowName As String) As LongPtr
Private Const MF_BYCOMMAND As Long = &H0&
Private Const SC_CLOSE As Long = &HF060&
Private Sub UserForm_Initialize()
Dim hMenu As LongPtr
Dim hWnd As LongPtr
' フォームのウィンドウハンドルを取得
hWnd = FindWindow("ThunderDFrame", Me.Caption)
' システムメニューのハンドルを取得
hMenu = GetSystemMenu(hWnd, 0)
' システムメニューから「閉じる」ボタンを削除
Call RemoveMenu(hMenu, SC_CLOSE, MF_BYCOMMAND)
End Sub
コメント