用API创建菜单!
################################################################################
AppendMenu VB声明 
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 
说明 
在指定的菜单里添加一个菜单项 
返回值 
Long,非零表示成功,零表示失败。会设置GetLastError 
参数表 
参数 类型及说明 
hMenu Long,菜单句柄 
wFlags Long,参考ModifyMenu函数中的菜单常数标志定义表,其中列出了允许使用的所有常数 
wIDNewItem Long,指定菜单条目的新命令ID。如果在wFlags参数中指定了MF_POPUP字段,那么这应该是指向一个弹出式菜单的句柄 
lpNewItem String(相应的vb声明见注解),如果在wFlags参数中指定了MF_STRING标志,这就代表在菜单中设置的字串。如设置了MF_BITMAP标志,这就代表一个Long型变量,其中包含了一个位图句柄。如设置了MF_OWNERDRAW,这个值就会包括在DRAWITEMSTRUCT和MEASUREITEMSTRUCT结构中,在条目需要重画的时候由windows发送出去 
================================================================================
CreateMenu VB声明 
Declare Function CreateMenu Lib "user32" Alias "CreateMenu" () As Long 
说明 
创建新菜单 
返回值 
Long,如成功则返回新的顶级菜单的句柄;零意味着错误 
注解 
最开始创建时,菜单是空的。可用菜单api函数插入菜单条目。一旦菜单不再需要,记住用DestroyMenu将其删除
================================================================================
DeleteMenu VB声明 
Declare Function DeleteMenu Lib "user32" Alias "DeleteMenu" (ByVal hMenu As Long, ByVal nPosition As Long, ByVal wFlags As Long) As Long 
说明 
删除指定的菜单条目(在vb里使用:强烈建议用vb菜单的visible属性从菜单中删除条目。如使用这个函数,会造成指定菜单其他菜单条目的visible属性错误的影响菜单条目) 
返回值 
Long,非零表示成功,零表示失败。会设置GetLastError 
参数表 
参数 类型及说明 
hMenu Long,菜单句柄 
nPosition Long,欲删除菜单条目的标识符。如在wFlags中设置了MF_BYCOMMAND标志,这个参数就代表要改变的菜单条目的命令ID。如设置了MF_BYPOSITION标志,这个参数就代表条目在菜单中的位置(头一个条目肯定是零) 
wFlags Long,MF_BYPOSITION或MF_BYCOMMAND,具体由nPosition参数决定 
注解 
如条目连接了一个弹出式菜单,就会清除弹出式菜单。用RemoveMenu函数清除一个弹出式菜单条目,同时不影响整个弹出式菜单
================================================================================
DestroyMenu VB声明 
Declare Function DestroyMenu Lib "user32" Alias "DestroyMenu" (ByVal hMenu As Long) As Long 
说明 
删除指定的菜单。如菜单属于另一个菜单的一部分,或直接分配给一个窗口,那么菜单会在窗口清除后被自动删除 
返回值 
Long,非零表示成功,零表示失败。会设置GetLastError 
参数表 
参数 类型及说明 
hMenu Long,欲删除菜单的句柄 
注解 
这个函数通常用于CreateMenu和CreatePopupMenu函数创建的菜单
================================================================================
InsertMenu VB声明 
Declare Function InsertMenu Lib "user32" Alias "InsertMenuA" (ByVal hMenu As Long, ByVal nPosition As Long, ByVal wFlags As Long, ByVal wIDNewItem As Long, ByVal lpNewItem As Any) As Long 
说明 
在菜单的指定位置处插入一个菜单条目,并根据需要将其他条目向下移动 
返回值 
Long,非零表示成功,零表示失败。会设置GetLastError 
参数表 
参数 类型及说明 
hMenu Long,菜单的句柄 
nPosition Long,定义了新条目插入点的一个现有菜单条目的标志符。如果在wFlags中指定了MF_BYCOMMAND标志,这个参数就代表欲改变的菜单条目的命令ID。如设置的是MF_BYPOSITION标志,这个参数就代表菜单条目在菜单中的位置,第一个条目的位置为零 
wFlags Long,一系列常数标志的组合。参考ModifyMenu 
wIDNewItem Long,指定菜单条目的新菜单ID。如果在wFlags中指定了MF_POPUP标志,就应该指定弹出式菜单的一个句柄 
lpNewItem 如果在wFlags参数中设置了MF_STRING标志,就代表要设置到菜单中的字串(String)。如设置的是MF_BITMAP标志,就代表一个Long型变量,其中包含了一个位图句柄 
注解 
在vb里使用:这个函数做出的许多改变都可以正常发挥作用,但却不能由vb菜单对象反映出来。添加的命令ID必须能由vb菜单系统识别
 
================================================================================
CheckMenuItem VB声明 
Declare Function CheckMenuItem Lib "user32" Alias "CheckMenuItem" (ByVal hMenu As Long, ByVal wIDCheckItem As Long, ByVal wCheck As Long) As Long 
说明 
复选或撤消复选指定的菜单条目 
返回值 
Long,如条目的前一个状态是“复选”,就返回MF_CHECKED,如果是“未复选”,就返回MF_UNCHECKED。如指定的菜单条目不存在就返回-1 
参数表 
参数 类型及说明 
hMenu Long,菜单句柄 
wIDCheckItem Long,欲复选或撤消复选的菜单条目的标识符。如果在wCheck中指定了MF_BYCOMMAND标志,这个参数就用于指定要改变的菜单条目的命令ID。如果设置了MF_BYPOSITION标志,这个参数就用于指定条目在菜单中的位置(第一个条目的位置是0) 
wCheck Long,参考ModifyMenu函数中的菜单常数标志定义表,其中列出了允许使用的所有常数。针对这个函数,只能指定下述常数:MF_BYCOMMAND,MF_BYPOSITION,MF_CHECKED以及MF_UNCHECKED 
注解 
在vb里使用:由这个函数做出的改动可以正常发挥作用,但不会由vb菜单的checked属性反映出来 
具体的实现步骤非常复杂!建议你先去看看菜单API。我收集的API察看工具:
http://www.commacn.com/vbsworld/ExtFiles/api32.zip ←推荐
343KB
Win32 API帮助文件(中文版)http://sd.onlinedown.net/Snowswinapi.htm
最新1.2版
超人气的编程工具,一本实用的教科书,一个几万人使用的共享软件,为什么不下载试试,API尽情掌屋在你的手中。http://www.dapha.net/soure/api/allapi.zip
3981KB
它是一套学习Api函数不可缺少的软件,内置api流览器
 

解决方案 »

  1.   

    有必要这样做吗?会带来更大的维护的痛苦吧。vb6.0不支持自己写callback,所以可以写一个c++的dll来帮助实现。
    vb.net不知道支持了没有。
    微软的网站有很好的例子
    我建议你使用.INI或注册表或自定义的文件结构来描述自己的菜单结构。
    但是想要在增加一个dll的情况下实现功能菜单的增加,Hook是不可避免的。
    这样做的代价我觉得不值得。维护和技术要求比重新编译的代价高。
      

  2.   

    to zyl910(910:分儿,我来了!):请先看清楚人家的问题。人家又不是问怎么用API创建菜单。你贴这么多东西,头都给翻大了。
      

  3.   

    to:freeda(大马) 谁说vb6.0不支持自己写callback啊 用AddressOf
      

  4.   

    你的问题好像是关于Shell扩展的,但是不知道你是要在资源管理器中添加右键菜单,象winzip
    一样,还是添加菜单到IE,象Netants一样,或者是在Word、Outlook等中添加菜单。