Disable Form右上的 "X"
來源:CWW

要Disable Form "X" --> Close的功能(變暗灰色),事實上便是從Form左上方的System
Menu將關閉(Close)的MenuItem去除掉便可以了,去除後,又該如何Enable "X"呢,那
便是再將 關閉(Close)的MenuItem加回去,但這裡有個小問題,加回去之後"X"仍是暗
灰色,要等到我們做了某些固定的動作之後(如TitleBar上click一下,或選一下System
Menu等),它才會再度變Enable的顏色,我不知道讓TitleBar上的這些東西Refresh要送
什麼訊息,知道者請告訴我,所以現在我暫且Send一個在TitleBar上按下Mouse左鍵的訊
息給Form,令"X"能出現Enable的顏色。

'需一個Command Button
Private Declare Function GetSystemMenu Lib "User32" (ByVal hwnd As Long, ByVal bRevert As Long) As Long
Private Declare Function DeleteMenu Lib "User32" (ByVal hMenu As Long, ByVal nPosition As Long, ByVal wFlags As Long) As Long
Private Declare Function AppendMenu Lib "User32" Alias "AppendMenuA" (ByVal hMenu As Long, ByVal wFlags As Long, ByVal wIDNewItem As Long, ByVal lpNewItem As Any) As Long
Private Declare Function GetMenuString Lib "User32" Alias "GetMenuStringA" (ByVal hMenu As Long, ByVal wIDItem As Long, ByVal lpString As String, ByVal nMaxCount As Long, ByVal wFlag As Long) As Long
Private Declare Function SendMessage Lib "User32" Alias "SendMessageA" (ByVal hwnd As Long, ByVal wMsg As Long, ByVal wParam As Long, lParam As Any) As Long

Const WM_NCLBUTTONDBLCLK = &HA3
Const WM_NCLBUTTONDOWN = &HA1
Const HTCAPTION = 2
Const MF_STRING = &H0&
Const MF_BYCOMMAND = &H0&
Const SC_CLOSE = &HF060

Private hMenu As Long
Private CloseStr As String '記錄Close MenuItem的字串

'將"關閉"的那一個MenuItem 加回來
Private Sub Command1_Click()
Call AppendMenu(hMenu, MF_STRING, SC_CLOSE, CloseStr)

'令"X"能出現Enable的顏色
Call SendMessage(hwnd, WM_NCLBUTTONDOWN, HTCAPTION, 0&)
End Sub

Private Sub Form_Load()
hMenu = GetSystemMenu(Me.hwnd, 0)
CloseStr = String(255, 0)

'SC_CLOSE指的便是"關閉"的那一個MenuItem ID
Call GetMenuString(hMenu, SC_CLOSE, CloseStr, 256, MF_BYCOMMAND)
CloseStr = Left(CloseStr, InStr(1, CloseStr, Chr(0)) - 1)

Call DeleteMenu(hMenu, SC_CLOSE, MF_BYCOMMAND)
End Sub