你是否知道VB.NET借助API方法
#t#本人很喜歡VB.NET借助API,在工作中也很喜歡總結關于VB.NET借助API的經驗教訓,在特殊窗體的應用中,我們有時需要把窗體右上角標題欄上的關閉按鈕屏幕,當用戶點擊其它地方(比如說一個Button)退出,下面就這個問題來詳細說說吧。
我們還是來看一下在VB6中的實現,VB6中實現(借助API函數)
PrivateDeclareFunction GetSystemMenu Lib "user32" (ByVal hwnd AsLong, ByVal bRevert AsLong) AsLong
PrivateDeclareFunction GetMenuItemCount Lib "user32" (ByVal hMenu AsLong) AsLong
PrivateDeclareFunction DrawMenuBar Lib "user32" (ByVal hwnd AsLong) AsLong
PrivateDeclareFunction RemoveMenu Lib "user32" (ByVal hMenu AsLong, ByVal nPosition AsLong, ByVal wFlags AsLong) AsLong
Const MF_BYPOSITION = &H400&
Const MF_REMOVE = &H1000&
PrivateSub Form_Load()
Dim hSysMenu AsLong, nCnt AsLong
'Get handle to our form's system menu
'(Restore, Maximize, Move, close etc.)
hSysMenu = GetSystemMenu(Me.hwnd, False)
If hSysMenu Then
'Get System menu's menu count
nCnt = GetMenuItemCount(hSysMenu)
If nCnt Then
'Menu count is based on 0 (0, 1, 2, 3...)
RemoveMenu hSysMenu, nCnt - 1, MF_BYPOSITION Or MF_REMOVE
RemoveMenu hSysMenu, nCnt - 2, MF_BYPOSITION Or MF_REMOVE 'Remove the seperator
DrawMenuBar(Me.hwnd)
'Force caption bar's refresh. Disabling X button
Me.Caption = "Try to close me!"
EndIf
EndIf
EndSub
'如果還要屏蔽Alt+F4,加上
PrivateSub Form_QueryUnload(ByVal Cancel AsInteger, ByVal UnloadMode AsInteger)
Cancel = 1
EndSub
VB.NET借助API,因為系統沒有提供這樣的類,這個例子,同時給大家提供了一個API的使用范例。(因為系統類庫包裝了絕大部分API,所以不推薦使用)
以下是VB.NET的代碼:
- 'API聲明
- PrivateDeclareFunction GetSystemMenu Lib "User32" (ByVal hwnd AsInteger, ByVal bRevert AsLong) AsInteger
- PrivateDeclareFunction RemoveMenu Lib "User32" (ByVal hMenu AsInteger, ByVal nPosition AsInteger, ByVal wFlags AsInteger) AsInteger
- PrivateDeclareFunction DrawMenuBar Lib "User32" (ByVal hwnd AsInteger) AsInteger
- PrivateDeclareFunction GetMenuItemCount Lib "User32" (ByVal hMenu AsInteger) AsInteger
- PrivateConst MF_BYPOSITION = &H400&
- PrivateConst MF_DISABLED = &H2&
- PrivateSub disableX(ByVal wnd As Form)
- Dim hMenu AsInteger, nCount AsInteger
- '得到系統Menu
- hMenu = GetSystemMenu(wnd.Handle.ToInt32, 0)
- '得到系統Menu的個數
- nCount = GetMenuItemCount(hMenu)
- '去除系統Menu
- Call RemoveMenu(hMenu, nCount - 1, MF_BYPOSITION Or MF_DISABLED)
- '重畫MenuBar
- DrawMenuBar(Me.Handle.ToInt32)
- EndSub
- PrivateSub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) HandlesMyBase.Load
- '使用X不能用
- disableX(Me)
- EndSub
- PrivateSub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
- '關閉窗口
- Me.Close()
- EndSub
- '如果還要屏蔽Alt+F4,加上
- ProtectedOverridesSub WndProc(ByRef m As System.Windows.Forms.Message)
- Dim SC_CLOSE AsInteger = 61536
- Dim WM_SYSCOMMAND AsInteger = 274
- '判斷是系統消息,是不是關閉窗體,使Alt+F4無效
- If m.Msg = WM_SYSCOMMAND AndAlso m.WParam.ToInt32 = SC_CLOSE Then
- ExitSub
- EndIf
- MyBase.WndProc(m)
- EndSub

















