如何在系统菜单中添加一个自己的菜单项

来源:互联网 发布:二更网络主页 编辑:程序博客网 时间:2024/04/29 22:21

CSDN地址: http://topic.csdn.net/u/20080722/18/8517e419-7788-4d1c-9029-7a806f5da46c.html

全文:

如题,目前我要做的就是在系统菜单中添加一个自己的菜单项(比如是“联系人”这个界面,右下脚的“菜单”),并响应自己要实现的功能。分不够的我可以另外开帖给你加上。谢谢~~~~~
  • 对我有用[0]
  • 丢个板砖[0]
  • 引用
  • 举报
  • 管理
  • TOP
回复次数:33

 

  • ciahi用户头像
  • ciahi
  • (爪哇乞丐)
  • 等 级:
#1楼 得分:0回复于:2008-07-22 20:41:53
AppendMenu不行吗?
  • 对我有用[0]
  • 丢个板砖[0]
  • 引用
  • 举报
  • 管理
  • TOP
精华推荐:几个不错的symbian论坛
  • ro1ck用户头像
  • ro1ck
  • 等 级:
#2楼 得分:0回复于:2008-07-22 22:15:23
谢谢楼上的,不过应该没有这么简单吧,我指的菜单是系统对话框,而不是自己程序的对话框,比如系统有个对话框叫"联系人",该窗口有它自己的菜单项.目前大概方向是修改注册表,但是一直没发现相关的主键,请有做过的达人指教。
  • 对我有用[0]
  • 丢个板砖[0]
  • 引用
  • 举报
  • 管理
  • TOP
精华推荐:急,nec本本无法启动!硬盘光驱转风扇处理器不工作,求教!
  • btsy2000用户头像
  • btsy2000
  • (毛毛虫)
  • 等 级:
#3楼 得分:50回复于:2008-07-22 23:54:46
下面这篇文章里包括了所有你要的东西 
http://msdn.microsoft.com/en-us/library/bb158572.aspx

当弹出菜单时会发送WM_INITMENUPOPUP消息,拿到菜单句柄就可以添加删除
  • 对我有用[0]
  • 丢个板砖[0]
  • 引用
  • 举报
  • 管理
  • TOP
精华推荐:Windows Mobile手机用usb连接PC,用RAPI远程调用方法和TCP相比那种方法传输效率更高?
  • ro1ck用户头像
  • ro1ck
  • 等 级:
#4楼 得分:0回复于:2008-07-23 08:49:38
谢谢楼上的,可以留下msn吗
  • 对我有用[0]
  • 丢个板砖[0]
  • 引用
  • 举报
  • 管理
  • TOP
精华推荐:如何打开设置页和程序页
  • caicaileowince用户头像
  • caicaileowince
  • 等 级:
#5楼 得分:0回复于:2008-07-23 08:59:20
SDK例子里有ctxmenu,实质是一个com组件,添加到注册表里联系人启动的时候调用com组件
  • 对我有用[0]
  • 丢个板砖[0]
  • 引用
  • 举报
  • 管理
  • TOP
精华推荐:mobile C/C++读写XML文件
  • ro1ck用户头像
  • ro1ck
  • 等 级:
#6楼 得分:0回复于:2008-07-23 09:20:02
不是很明白楼上的意思,这个com组件是系统自带吗?
具体怎么实现的呢
  • 对我有用[0]
  • 丢个板砖[0]
  • 引用
  • 举报
  • 管理
  • TOP
  • ro1ck用户头像
  • ro1ck
  • 等 级:
#7楼 得分:0回复于:2008-07-23 16:28:13
有些进展了,不过有个问题,发现在QueryContextMenu这函数中pIdo->GetData(&fe, &sm)这个函数失败了,GetLastError居然是120(这个系统不支持该功能).
  • 对我有用[0]
  • 丢个板砖[0]
  • 引用
  • 举报
  • 管理
  • TOP
  • ro1ck用户头像
  • ro1ck
  • 等 级:
#8楼 得分:0回复于:2008-07-23 19:51:36
自己顶
  • 对我有用[0]
  • 丢个板砖[0]
  • 引用
  • 举报
  • 管理
  • TOP
  • wuminxss用户头像
  • wuminxss
  • (英俊走一回)
  • 等 级:
#9楼 得分:0回复于:2008-07-23 21:57:34
引用 3 楼 btsy2000 的回复:
下面这篇文章里包括了所有你要的东西
http://msdn.microsoft.com/en-us/library/bb158572.aspx

当弹出菜单时会发送WM_INITMENUPOPUP消息,拿到菜单句柄就可以添加删除


如果我要在Start->Messaging界面的右键菜单加一个菜单项,与之相关的class和Context是哪个?
微软有公布吗?
  • 对我有用[0]
  • 丢个板砖[0]
  • 引用
  • 举报
  • 管理
  • TOP
  • ro1ck用户头像
  • ro1ck
  • 等 级:
#10楼 得分:0回复于:2008-07-24 09:20:56
wuminxss ,应该是 context:Inbox,class就看具体哪个界面了
  • 对我有用[0]
  • 丢个板砖[0]
  • 引用
  • 举报
  • 管理
  • TOP
  • hnhuibo用户头像
  • hnhuibo
  • (飞扬洞庭)
  • 等 级:
#11楼 得分:0回复于:2008-07-24 09:33:35
d
  • 对我有用[0]
  • 丢个板砖[0]
  • 引用
  • 举报
  • 管理
  • TOP
  • ro1ck用户头像
  • ro1ck
  • 等 级:
#12楼 得分:0回复于:2008-07-24 10:57:44
在添加菜单项时,为什么要加DelayLoad这个dword键值呢?如果设置为1,菜单响应时,不会调用到自己定义的COM组件的QueryContextMenu函数,而且菜单直接显示的菜单项名称是注册表中默认的字串名。如果设置为0,在COM组件的QueryContextMenu函数里,有个pIdo->GetData(&fe,&sm)函数,会失败,有人知道为什么吗?是不是我注册表中少了什么项?
  • 对我有用[0]
  • 丢个板砖[0]
  • 引用
  • 举报
  • 管理
  • TOP
  • ren22342411用户头像
  • ren22342411
  • (枪挑一条线)
  • 等 级:
#13楼 得分:50回复于:2008-07-24 11:36:53
要使用IContextMenu这个接口。。。
可以参照一下这个例子,它在TMAIL里右下角的menu添加了两条选项
/Program Files/Windows Mobile 6 SDK/Samples/Common/CPP/Win32/InboxMenuExtensibility/
Contacts也是支持这个接口的
  • 对我有用[0]
  • 丢个板砖[0]
  • 引用
  • 举报
  • 管理
  • TOP
  • ro1ck用户头像
  • ro1ck
  • 等 级:
#14楼 得分:0回复于:2008-07-24 16:35:54
谢谢楼上.
还有个问题,在QueryContextMenu时如果同时insertmenu 2个菜单项,
InsertMenu ( hmenu, indexMenu, MF_BYPOSITION|MF_STRING , idCmdFirst, _T("Menu Test 1") ); 
InsertMenu ( hmenu, indexMenu, MF_BYPOSITION|MF_STRING , idCmdFirst, _T("Menu Test 2") ); 
在InvokeCommand中如何区分菜单,如何区分这两个菜单项?LPCMINVOKECOMMANDINFO pici->lpVerb是一个很大的数,并不是 0, 或者1
  • 对我有用[0]
  • 丢个板砖[0]
  • 引用
  • 举报
  • 管理
  • TOP
  • ren22342411用户头像
  • ren22342411
  • (枪挑一条线)
  • 等 级:
#15楼 得分:0回复于:2008-07-24 16:51:51
lpVerb 
A 32-bit value containing the commandbeing invoked, expressed as either a string (for programmaticinvocation), or a menu-identifier offset (for user invocation). 

Whencontaining a string, the HIWORD is non-zero. In this case, lpVerbcontains the address of a null-terminated string specifying thelanguage-independent name of the command. The system providespredefined constant values for some command strings. For details, seethe table below. 

When containing a menu-identifier offset,the HIWORD is zero. In this case, lpVerb contains a menu-identifieroffset of the command in the LOWORD. The shell specifies this valueusing MAKEINTRESOURCE(idOffset). For details, see "User InterfaceServices" in the Windows CE .NET 4.2 documentation. 
  • 对我有用[0]
  • 丢个板砖[0]
  • 引用
  • 举报
  • 管理
  • TOP
  • ren22342411用户头像
  • ren22342411
  • (枪挑一条线)
  • 等 级:
#16楼 得分:0回复于:2008-07-24 16:54:55
http://msdn.microsoft.com/en-us/library/bb773215(VS.85).aspx
  • 对我有用[0]
  • 丢个板砖[0]
  • 引用
  • 举报
  • 管理
  • TOP
  • ren22342411用户头像
  • ren22342411
  • (枪挑一条线)
  • 等 级:
#17楼 得分:0回复于:2008-07-24 16:58:47
(LPCTSTR)lpici->lpVerb
是你menu上显示的字符串的地址
  • 对我有用[0]
  • 丢个板砖[0]
  • 引用
  • 举报
  • 管理
  • TOP
  • ro1ck用户头像
  • ro1ck
  • 等 级:
#18楼 得分:0回复于:2008-07-24 17:32:59
非常感 ren22342411 :),果然是高手啊,方便留下联系方式吗?
向你学习!
呵呵
  • 对我有用[0]
  • 丢个板砖[0]
  • 引用
  • 举报
  • 管理
  • TOP
  • ro1ck用户头像
  • ro1ck
  • 等 级:
#19楼 得分:0回复于:2008-07-24 18:49:18
但是我读出来显示是乱码,并不是菜单名,晕
  • 对我有用[0]
  • 丢个板砖[0]
  • 引用
  • 举报
  • 管理
  • TOP
  • ro1ck用户头像
  • ro1ck
  • 等 级:
#20楼 得分:0回复于:2008-07-24 19:05:35
是空的
  • 对我有用[0]
  • 丢个板砖[0]
  • 引用
  • 举报
  • 管理
  • TOP
  • ren22342411用户头像
  • ren22342411
  • (枪挑一条线)
  • 等 级:
#21楼 得分:0回复于:2008-07-24 19:43:44
好好检查一下。。
QueryContextMenu(HMENU hmenu,UINT indexMenu, UINT idCmdFirst, UINT idCmdLast, UINT uFlags)

InsertMenu ( hmenu, indexMenu, MF_BYPOSITION ¦MF_STRING , idCmdFirst, _T("Menu Test 1") ); 
InsertMenu ( hmenu, indexMenu, MF_BYPOSITION ¦MF_STRING , idCmdFirst, _T("Menu Test 2") ); 
为什么两个Menu的ID是相同的?
他们的范围应该在idCmdFirst 和 idCmdLast 之间
还有你现在是不是menu已经扩展出来,只是没有执行么?
  • 对我有用[0]
  • 丢个板砖[0]
  • 引用
  • 举报
  • 管理
  • TOP
  • ren22342411用户头像
  • ren22342411
  • (枪挑一条线)
  • 等 级:
#22楼 得分:0回复于:2008-07-25 10:36:09
lz我知道你的问题了...你还没有实现接口IContextMenu中
GetCommandString(UINT_PTR idCmd,UINT uType, UINT* pwReserved, LPSTR pszName, UINT cchMax)
这个方法...
这个方法的作用是把menu的ID和其字符串对应起来的
  • 对我有用[0]
  • 丢个板砖[0]
  • 引用
  • 举报
  • 管理
  • TOP
  • ro1ck用户头像
  • ro1ck
  • 等 级:
#23楼 得分:0回复于:2008-07-25 10:46:55
啊,强,我没有对这个函数进行操作,我修改试试
  • 对我有用[0]
  • 丢个板砖[0]
  • 引用
  • 举报
  • 管理
  • TOP
  • ren22342411用户头像
  • ren22342411
  • (枪挑一条线)
  • 等 级:
#24楼 得分:0回复于:2008-07-25 11:00:47
好好看一下那个例子。。。
我邮箱rr.tj.sse@gmail.com
有问题大家可以一起讨论 :)
  • 对我有用[0]
  • 丢个板砖[0]
  • 引用
  • 举报
  • 管理
  • TOP
  • ro1ck用户头像
  • ro1ck
  • 等 级:
#25楼 得分:0回复于:2008-07-25 11:01:42
谢谢:)
  • 对我有用[0]
  • 丢个板砖[0]
  • 引用
  • 举报
  • 管理
  • TOP
  • ro1ck用户头像
  • ro1ck
  • 等 级:
#26楼 得分:0回复于:2008-07-25 11:47:38
搞定了,谢谢,菜单问题差不多了,现在有个关键的问题,比如现在我在联系人添加了个自己的菜单,在菜单响应怎么获得目前联系人的信息呢,比如名称,电话等
  • 对我有用[0]
  • 丢个板砖[0]
  • 引用
  • 举报
  • 管理
  • TOP
  • ren22342411用户头像
  • ren22342411
  • (枪挑一条线)
  • 等 级:
#27楼 得分:0回复于:2008-07-25 11:58:08
这个可能需要用到POOM方面的东西
需要使用IItem接口了,可能还有
IPimSrcContactListIcon 联系人的图标
IPimSrcContactNew 创建一个联系人
IPimSrcContactSummaryCard 点击一个联系人
IPimSrcContactEdit 编辑
这些接口。。没有深入研究过
可以参照下面这个例子:
/Program Files/Windows Mobile 6 SDK/Samples/PocketPC/CPP/win32/PimExProvider

主要还是好好研究POOM
  • 对我有用[0]
  • 丢个板砖[0]
  • 引用
  • 举报
  • 管理
  • TOP
  • ro1ck用户头像
  • ro1ck
  • 等 级:
#28楼 得分:0回复于:2008-07-25 14:11:23
联系人这个com有用过,现在问题在于,比如现在点桌面右下角的联系人,进入联系人界面,而且我的菜单已经嵌入联系人菜单中。比如联系人有3个联系人,"张三","李四","王五",然后我选择"李四"这个联系人,弹出菜单,这时候我的菜单处理函数要如何获得我当前选择的是"李四"呢?
  • 对我有用[0]
  • 丢个板砖[0]
  • 引用
  • 举报
  • 管理
  • TOP
  • ro1ck用户头像
  • ro1ck
  • 等 级:
#29楼 得分:0回复于:2008-07-26 11:13:04
  • 对我有用[0]
  • 丢个板砖[0]
  • 引用
  • 举报
  • 管理
  • TOP
  • ro1ck用户头像
  • ro1ck
  • 等 级:
#30楼 得分:0回复于:2008-07-29 10:43:55
终于解决了,其实获取当前联系人index的代码在ctxmenu例子中是有的,IDataObject去获取指针进行操作,只是没有对特定联系人进行操作,如果要获取联系人的指针,formatEtc.cfFormat =RegisterClipboardFormat(CFNAME_ITEMREFARRAY);这个参数必须这样设置。http://msdn.microsoft.com/en-us/library/ms879952.aspx上的菜单view有关联系人的Clipboard format的介绍。

好了,结帖了,非常感谢关注这个帖子的朋友们。特别感谢btsy2000 提供了研究方向,还有ren22342411 ,在菜单问题上的帮助。希望可以和大家一起研究mobile。
原创粉丝点击