您的位置:逆风者 VB 正文
原作者:www.upwinder.com 添加时间:2007-09-02 原文发表:2007-08-31 人气:11 来源:未知

本文章共1963字,分2页,当前第1页,快速翻页:
 
本文题目所说的系统菜单不是指应用程序系统的菜单,而是指当用户用鼠标左键单击应用程序窗体左上角的图标时弹出的菜单。同样,当用户用鼠标右键单击应用程序窗体的标题栏,或系统任务栏中的应用程序标题时,弹出的也是这个菜单。系统菜单与应用程序菜单不一样,系统菜单不受应用程序控制,它是由Windows系统直接控制的。因此,在系统菜单上添加自定义菜单项,就显得比较困难。以下便是本人利用VB实现在系统菜单上添加自定义菜单项的方法。
逆风者
---- 首先需要知道一点是系统菜单的工作过程。当我们单击系统菜单中某一项时,应用程序窗口会收到一条WM_SYSCOMMAND消息,该消息包含了系统菜单中所单击那一项的标识符ID。此时,应用程序窗口的默认窗口函数会根据WM_SYSCOMMAND消息以及菜单标识符ID执行相应的操作,完成菜单命令。如果我们能拦截到达窗口的WM_SYSCOMMAND消息,并且识别出菜单的标识符ID,我们就能够在系统菜单上添加自己的菜单项,并且执行指定的动作。下面的例子就是在系统菜单上添加一条分隔符和"关于…"菜单项。

---- 启动Visual Basic,新建标准EXE工程,在工程中添加一标准模块,名称可以是默认的。在标准模块的声明部分加入下列代码:

'菜单API函数声明
Public Declare Function GetSystemMenu Lib "user32" (ByVal hwnd As Long, ByVal bRevert As Long) As Long
Public 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 '菜单API函数常数声明
Public Const MF_BYCOMMAND = "H0"
Public Const MF_SEPARATOR ="H800"
Public Const MF_STRING = "H0" '有关窗口函数的API函数声明
Public Declare Function SetWindowLong Lib "user32" Alias "SetWindowLongA" (ByVal hwnd As Long, ByVal nIndex As Long,ByVal dwNewLong As Long) As Long
Public Declare Function CallWindowProc Lib "user32" Alias "CallWindowProcA" (ByVal lpPrevWndFunc As Long, ByVal hwnd As Long, ByVal Msg As Long, ByVal wParam As Long, ByVal lParam As Long) As Long
Public Declare Function DefWindowProc Lib "user32" Alias "DefWindowProcA" (ByVal hwnd As Long, ByVal wMsg As Long, ByVal wParam As Long, ByVal lParam As Long) As Long '消息
Public Const GWL_WNDPROC = (-4)
Public Const WM_NCLBUTTONDOWN = "HA1"
Public Const WM_NCRBUTTONDOWN = "HA4"
Public Const WM_USER = "H400"
Public Const WM_SYSCOMMAND = "H112"
Public Const HTSYSMENU = 3
Public Const HTCAPTION = 2 '自定义菜单项的标识号偏移量
Public Const IDM_SEPARATOR = 1
Public Const IDM_MYABOUT = 2 '其他变量
Dim sHwnd As Long
Dim OldProc As Long
接着可向标准模块添加下面两个过程: Public Sub AddMenu(frm As Form) '置换窗口函数过程
sHwnd = frm.hwnd
OldProc = SetWindowLong(frm.hwnd, GWL_WNDPROC, AddressOf AddCallBack)
End Sub
Public Sub Release() '释放自定义窗口函数过程
SetWindowLong sHwnd,GWL_WNDPROC, OldProc
End Sub

最后向标准模块中添加一自定义窗口函数过程:
Public Function AddCallBack(ByVal hwnd As Long, ByVal wMsg As Long, ByVal wParam As Long, ByVal lParam As Long) As Long Select Case wMsg Case WM_SYSCOMMAND
'系统消息
Select Case wParam '测试
Case WM_USER IDM_MYABOUT
'"关于..."菜单项
'此处可加入用户需要自己处理"关于…" 菜单项的代码
MsgBox "单击了添加的菜单条目",VBOKOnly

Case Else '其它菜单项交换系统处理
AddCallBack =DefWindowProc(hwnd, wMsg, wParam, lParam)
End Select
Exit Function
Case Else
AddCallBack = CallWindowProc(OldProc, hwnd, wMsg, wParam, lParam) End
 
本文章更多内容1 - 2 - 下一页>>
相关文章

VB 从零开始编外挂(二)
用VB制作即时动态按钮
趣味撞球--VB应用程序一例
教小朋友认识 红绿灯
一组VB实用小程序
利用VB提取HTML文件中的EMAIL地址
用Visual Basic也可以实现P2P
用VB实现Win2000用户限时登录
操作过程动态显示
使用VB获取网上邻居里的计算机名
ODBC API 的VB Sample
API实现完美的图片出现效果
VB 从零开始编外挂(八)
在WindowsNT网络中广播消息
利用VB实现浮动按钮
VB应用程序中打印条形码的两种方法
如何用VB建立快捷方式
带有历史记录功能的菜单
解除网虫心病 VB做定时断线程序
用Visual Basic与MS-Draw开发通用作图软件

相关评论


本文章所属分类:首页 VB

  热门关键字: