你是否知道VB.NET借助API方法
创始人
2024-06-10 14:50:55
0

#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的代码:

  1. 'API声明  
  2. PrivateDeclareFunction GetSystemMenu Lib "User32" (ByVal hwnd AsInteger, ByVal bRevert AsLong) AsInteger  
  3. PrivateDeclareFunction RemoveMenu Lib "User32" (ByVal hMenu AsInteger, ByVal nPosition AsInteger, ByVal wFlags AsInteger) AsInteger  
  4. PrivateDeclareFunction DrawMenuBar Lib "User32" (ByVal hwnd AsInteger) AsInteger  
  5. PrivateDeclareFunction GetMenuItemCount Lib "User32" (ByVal hMenu AsInteger) AsInteger  
  6. PrivateConst MF_BYPOSITION = &H400&  
  7. PrivateConst MF_DISABLED = &H2&  
  8.    
  9. PrivateSub disableX(ByVal wnd As Form)  
  10. Dim hMenu AsInteger, nCount AsInteger  
  11. '得到系统Menu  
  12. hMenu = GetSystemMenu(wnd.Handle.ToInt32, 0)  
  13. '得到系统Menu的个数  
  14. nCount = GetMenuItemCount(hMenu)  
  15. '去除系统Menu  
  16. Call RemoveMenu(hMenu, nCount - 1, MF_BYPOSITION Or MF_DISABLED)  
  17. '重画MenuBar  
  18. DrawMenuBar(Me.Handle.ToInt32)  
  19. EndSub  
  20.    
  21. PrivateSub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) HandlesMyBase.Load  
  22. '使用X不能用  
  23. disableX(Me)  
  24. EndSub  
  25.    
  26. PrivateSub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click  
  27. '关闭窗口  
  28. Me.Close()  
  29. EndSub  
  30.    
  31. '如果还要屏蔽Alt+F4,加上  
  32. ProtectedOverridesSub WndProc(ByRef m As System.Windows.Forms.Message)  
  33. Dim SC_CLOSE AsInteger = 61536 
  34. Dim WM_SYSCOMMAND AsInteger = 274 
  35. '判断是系统消息,是不是关闭窗体,使Alt+F4无效  
  36. If m.Msg = WM_SYSCOMMAND AndAlso m.WParam.ToInt32 = SC_CLOSE Then  
  37. ExitSub  
  38. EndIf  
  39. MyBase.WndProc(m)  
  40. EndSub 

相关内容

热门资讯

如何允许远程连接到MySQL数... [[277004]]【51CTO.com快译】默认情况下,MySQL服务器仅侦听来自localhos...
如何利用交换机和端口设置来管理... 在网络管理中,总是有些人让管理员头疼。下面我们就将介绍一下一个网管员利用交换机以及端口设置等来进行D...
施耐德电气数据中心整体解决方案... 近日,全球能效管理专家施耐德电气正式启动大型体验活动“能效中国行——2012卡车巡展”,作为该活动的...
Windows恶意软件20年“... 在Windows的早期年代,病毒游走于系统之间,偶尔删除文件(但被删除的文件几乎都是可恢复的),并弹...
规避非法攻击 用好路由器远程管... 单位在市区不同位置设立了科技服务点,每一个服务点的员工都通过宽带路由器进行共享上网,和单位网络保持联...
20个非常棒的扁平设计免费资源 Apple设备的平面图标PSD免费平板UI 平板UI套件24平图标Freen平板UI套件PSD径向平...
范例解读VB.NET获取环境变... VB.NET编程语言的使用范围非常广泛,可以帮助开发人员处理各种程序中的需求,而且还能对移动设备进行...
德国电信门户网站可实时显示全球... 德国电信周三推出一个门户网站,直观地实时提供其安装在全球各地的传感器网络检测到的网络攻击状况。该网站...