王朝网络
分享
 
 
 

在系统菜单上添加自定义菜单项

王朝厨房·作者佚名  2007-01-04
宽屏版  字体: |||超大  

作者:马鞍山钢铁总公司职工大学 王加龙

---- 本文题目所说的系统菜单不是指应用程序系统的菜单,而是指当用户用鼠标左键单击应用程序窗体左上角的图标时弹出的菜单。同样,当用户用鼠标右键单击应用程序窗体的标题栏,或系统任务栏中的应用程序标题时,弹出的也是这个菜单。系统菜单与应用程序菜单不一样,系统菜单不受应用程序控制,它是由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 Select

End Function

关闭标准模块的代码窗口,

打开窗体的代码窗口,

在Form_Load()过程中加入下列代码:

’加载自定义窗口过程

AddMenu Me

’获得系统菜单的句柄

Dim hMenu As Long

hMenu = GetSystemMenu(Me.hwnd, 0)

’在系统菜单中添加自定义2条菜单项

AppendMenu hMenu, MF_SEPARATOR

Or MF_BYCOMMAND,

IDM_SEPARATOR, vbNullString

’分隔符

AppendMenu hMenu, MF_BYCOMMAND

Or MF_STRING,

WM_USER + IDM_MYABOUT, "关于..."

"关于…"菜单项

在Form_Unload过程中加入下列代码:

Release ’释放自定义窗口过程

---- 到此,代码的输入工作完成,接下来的是进行测试。单击启动按钮或按F5,启动工程,用鼠标单击窗体左上角的图标弹出系统菜单,看看是否如愿。千万要注意的一点是,在结束工程时,一定要用窗体右上角的关闭按钮或者系统菜单中的关闭菜单项,否则的话,会造成Visual Basic系统崩溃,出现非法操作的错误,所以在测试工程前,最好对工程进行保存。

---- 以上程序在Windows95,Visual Basic6.0环境下调试通过。

 
 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
2023年上半年GDP全球前十五强
 百态   2023-10-24
美众议院议长启动对拜登的弹劾调查
 百态   2023-09-13
上海、济南、武汉等多地出现不明坠落物
 探索   2023-09-06
印度或要将国名改为“巴拉特”
 百态   2023-09-06
男子为女友送行,买票不登机被捕
 百态   2023-08-20
手机地震预警功能怎么开?
 干货   2023-08-06
女子4年卖2套房花700多万做美容:不但没变美脸,面部还出现变形
 百态   2023-08-04
住户一楼被水淹 还冲来8头猪
 百态   2023-07-31
女子体内爬出大量瓜子状活虫
 百态   2023-07-25
地球连续35年收到神秘规律性信号,网友:不要回答!
 探索   2023-07-21
全球镓价格本周大涨27%
 探索   2023-07-09
钱都流向了那些不缺钱的人,苦都留给了能吃苦的人
 探索   2023-07-02
倩女手游刀客魅者强控制(强混乱强眩晕强睡眠)和对应控制抗性的关系
 百态   2020-08-20
美国5月9日最新疫情:美国确诊人数突破131万
 百态   2020-05-09
荷兰政府宣布将集体辞职
 干货   2020-04-30
倩女幽魂手游师徒任务情义春秋猜成语答案逍遥观:鹏程万里
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案神机营:射石饮羽
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案昆仑山:拔刀相助
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案天工阁:鬼斧神工
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案丝路古道:单枪匹马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:与虎谋皮
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:李代桃僵
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:指鹿为马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:小鸟依人
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:千金买邻
 干货   2019-11-12
 
>>返回首页<<
推荐阅读
 
 
频道精选
静静地坐在废墟上,四周的荒凉一望无际,忽然觉得,凄凉也很美
© 2005- 王朝网络 版权所有