Declare Function GetSystemMenu Lib "user32" Alias "GetSystemMenu" (ByVal hwnd As Long, ByVal bRevert As Long) As Long Private Declare Function GetMenuItemInfo Lib "user32" Alias "GetMenuItemInfoA" (ByVal hMenu As Long, ByVal un As Long, ByVal b As Long, lpMenuItemInfo As MENUITEMINFO) As Long Declare Function SetMenuItemInfo Lib "user32" Alias "SetMenuItemInfoA" (ByVal hMenu As Long, ByVal un As Long, ByVal bool As Boolean, lpcMenuItemInfo As MENUITEMINFO) As Long Declare Function SendMessage Lib "user32" Alias "SendMessageA" (ByVal hwnd As Long, ByVal wMsg As Long, ByVal wParam As Long, lParam As Any) As Long Public Type MENUITEMINFO cbSize As Long fMask As Long fType As Long fState As Long wID As Long hSubMenu As Long hbmpChecked As Long hbmpUnchecked As Long dwItemData As Long dwTypeData As String cch As Long End Type Public Const SC_CLOSE = &HF060& Public Const xMenuID = 10& Public Const MIIM_STATE = &H1& Public Const MIIM_ID = &H2& Public Const WM_NCACTIVATE = &H86 'in form module Dim hMenu As Long, MII As MENUITEMINFO hMenu = GetSystemMenu(FormName.hWnd, 0) MII.cbSize = Len(MII) MII.dwTypeData = String(80, 0) MII.cch = Len(MII.dwTypeData) MII.fMask = MIIM_STATE MII.wID = SC_CLOSE
标准模块 Declare Function GetSystemMenu Lib "user32" (ByVal hwnd As Long, ByVal bRevert As Long) As Long Declare Function DeleteMenu Lib "user32" (ByVal hMenu As Long, ByVal nPosition As Long, ByVal wFlags As Long) As Long 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 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 Declare Function SendMessage Lib "user32" Alias "SendMessageA" (ByVal hwnd As Long, ByVal wMsg As Long, ByVal wParam As Long, lParam As Any) As Long窗体 Option Explicit Private hMenu As Long Private CloseStr As String Const WM_NCLBUTTONDBLCLK = &HA3 Const WM_NCLBUTTONDOWN = &HA1 Const HTCAPTION = 2 Const MF_STRING = &H0& Const MF_BYCOMMAND = &H0& Const SC_CLOSE = &HF060Private Sub Command2_Click() hMenu = GetSystemMenu(Form1.hwnd, 0) CloseStr = String(255, 0) GetMenuString hMenu, SC_CLOSE, CloseStr, 256, MF_BYCOMMAND CloseStr = Left(CloseStr, InStr(1, CloseStr, Chr(0)) - 1) DeleteMenu hMenu, SC_CLOSE, MF_BYCOMMAND SendMessage hwnd, WM_NCLBUTTONDOWN, HTCAPTION, 0& End Sub
Private Declare Function GetMenuItemInfo Lib "user32" Alias "GetMenuItemInfoA" (ByVal hMenu As Long, ByVal un As Long, ByVal b As Long, lpMenuItemInfo As MENUITEMINFO) As Long
Declare Function SetMenuItemInfo Lib "user32" Alias "SetMenuItemInfoA" (ByVal hMenu As Long, ByVal un As Long, ByVal bool As Boolean, lpcMenuItemInfo As MENUITEMINFO) As Long
Declare Function SendMessage Lib "user32" Alias "SendMessageA" (ByVal hwnd As Long, ByVal wMsg As Long, ByVal wParam As Long, lParam As Any) As Long Public Type MENUITEMINFO
cbSize As Long
fMask As Long
fType As Long
fState As Long
wID As Long
hSubMenu As Long
hbmpChecked As Long
hbmpUnchecked As Long
dwItemData As Long
dwTypeData As String
cch As Long
End Type
Public Const SC_CLOSE = &HF060&
Public Const xMenuID = 10&
Public Const MIIM_STATE = &H1&
Public Const MIIM_ID = &H2&
Public Const WM_NCACTIVATE = &H86
'in form module
Dim hMenu As Long, MII As MENUITEMINFO
hMenu = GetSystemMenu(FormName.hWnd, 0)
MII.cbSize = Len(MII)
MII.dwTypeData = String(80, 0)
MII.cch = Len(MII.dwTypeData)
MII.fMask = MIIM_STATE
MII.wID = SC_CLOSE
GetMenuItemInfo hMenu, SC_CLOSE, False, MII
MII.wID = xMenuID
MII.fMask = MIIM_ID
SetMenuItemInfo hMenu, SC_CLOSE, False, MII
SendMessage Me.hWnd, WM_NCACTIVATE, True, ByVal 0&
BTW,上面这个程序似乎不能使用,请赐教,非常感谢!
把函数和常数及结构的声明放在标准模里。下面的Code写在Form_load里就可以试一试。不过你可以自己组织一下写成过程。
不用非Api可能不行,因为Vb对菜单的操作是非常弱的。
Declare Function GetSystemMenu Lib "user32" (ByVal hwnd As Long, ByVal bRevert As Long) As Long
Declare Function DeleteMenu Lib "user32" (ByVal hMenu As Long, ByVal nPosition As Long, ByVal wFlags As Long) As Long
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
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
Declare Function SendMessage Lib "user32" Alias "SendMessageA" (ByVal hwnd As Long, ByVal wMsg As Long, ByVal wParam As Long, lParam As Any) As Long窗体
Option Explicit
Private hMenu As Long
Private CloseStr As String
Const WM_NCLBUTTONDBLCLK = &HA3
Const WM_NCLBUTTONDOWN = &HA1
Const HTCAPTION = 2
Const MF_STRING = &H0&
Const MF_BYCOMMAND = &H0&
Const SC_CLOSE = &HF060Private Sub Command2_Click()
hMenu = GetSystemMenu(Form1.hwnd, 0)
CloseStr = String(255, 0)
GetMenuString hMenu, SC_CLOSE, CloseStr, 256, MF_BYCOMMAND
CloseStr = Left(CloseStr, InStr(1, CloseStr, Chr(0)) - 1)
DeleteMenu hMenu, SC_CLOSE, MF_BYCOMMAND
SendMessage hwnd, WM_NCLBUTTONDOWN, HTCAPTION, 0&
End Sub
hMenu = GetSystemMenu(FormName.hWnd, 0) 更正为hMenu = GetSystemMenu(me.hWnd, 0)
danielinbiti(金)的方法是移除菜单的方法,而我的方法只是屏蔽掉。