CSDN地址: http://topic.csdn.net/u/20080722/18/8517e419-7788-4d1c-9029-7a806f5da46c.html
全文:
如题,目前我要做的就是在系统菜单中添加一个自己的菜单项(比如是“联系人”这个界面,右下脚的“菜单”),并响应自己要实现的功能。分不够的我可以另外开帖给你加上。谢谢~~~~~
#1楼 得分:0 回复于:2008-07-22 20:41:53
#2楼 得分:0 回复于:2008-07-22 22:15:23
谢谢楼上的,不过应该没有这么简单吧,我指的菜单是系统对话框,而不是自己程序的对话框,比如系统有个对话框叫"联系人",该窗口有它自己的菜单项.目前大概方向是修改注册表,但是一直没发现相关的主键,请有做过的达人指教。
#3楼 得分:50 回复于:2008-07-22 23:54:46
下面这篇文章里包括了所有你要的东西
http://msdn.microsoft.com/en-us/library/bb158572.aspx
当弹出菜单时会发送WM_INITMENUPOPUP消息,拿到菜单句柄就可以添加删除
#4楼 得分:0 回复于:2008-07-23 08:49:38
#5楼 得分:0 回复于:2008-07-23 08:59:20
SDK例子里有ctxmenu,实质是一个com组件,添加到注册表里联系人启动的时候调用com组件
#6楼 得分:0 回复于:2008-07-23 09:20:02
不是很明白楼上的意思,这个com组件是系统自带吗?
具体怎么实现的呢
#7楼 得分:0 回复于:2008-07-23 16:28:13
有些进展了,不过有个问题,发现在QueryContextMenu这函数中pIdo->GetData(&fe, &sm)这个函数失败了,GetLastError居然是120(这个系统不支持该功能).
#8楼 得分:0 回复于:2008-07-23 19:51:36
#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是哪个?
微软有公布吗?
#10楼 得分:0 回复于:2008-07-24 09:20:56
wuminxss ,应该是 context:Inbox,class就看具体哪个界面了
#11楼 得分:0 回复于:2008-07-24 09:33:35
#12楼 得分:0 回复于:2008-07-24 10:57:44
在添加菜单项时,为什么要加DelayLoad这个dword键值呢?如果设置为1,菜单响应时,不会调用到 自己定义的COM组件的QueryContextMenu函数,而且菜单直接显示的菜单项名称是注册表中默认的字串名。如果设置为0,在COM组件的 QueryContextMenu函数里,有个pIdo->GetData(&fe, &sm)函数,会失败,有人知道为什么吗?是不是我注册表中少了什么项?
#13楼 得分:50 回复于:2008-07-24 11:36:53
要使用IContextMenu这个接口。。。
可以参照一下这个例子,它在TMAIL里右下角的menu添加了两条选项
/Program Files/Windows Mobile 6 SDK/Samples/Common/CPP/Win32/InboxMenuExtensibility/
Contacts也是支持这个接口的
#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
#15楼 得分:0 回复于:2008-07-24 16:51:51
lpVerb
A 32-bit value containing the command being invoked, expressed as either a string (for programmatic invocation), or a menu-identifier offset (for user invocation).
When containing a string, the HIWORD is non-zero. In this case, lpVerb contains the address of a null-terminated string specifying the language-independent name of the command. The system provides predefined constant values for some command strings. For details, see the table below.
When containing a menu-identifier offset, the HIWORD is zero. In this case, lpVerb contains a menu-identifier offset of the command in the LOWORD. The shell specifies this value using MAKEINTRESOURCE(idOffset). For details, see "User Interface Services" in the Windows CE .NET 4.2 documentation.
#16楼 得分:0 回复于:2008-07-24 16:54:55
http://msdn.microsoft.com/en-us/library/bb773215(VS.85).aspx
#17楼 得分:0 回复于:2008-07-24 16:58:47
(LPCTSTR)lpici->lpVerb
是你menu上显示的字符串的地址
#18楼 得分:0 回复于:2008-07-24 17:32:59
非常感 ren22342411 :),果然是高手啊,方便留下联系方式吗?
向你学习!
呵呵
#19楼 得分:0 回复于:2008-07-24 18:49:18
#20楼 得分:0 回复于:2008-07-24 19:05:35
#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已经扩展出来,只是没有执行么?
#22楼 得分:0 回复于:2008-07-25 10:36:09
lz我知道你的问题了...你还没有实现接口IContextMenu中
GetCommandString(UINT_PTR idCmd,UINT uType, UINT* pwReserved, LPSTR pszName, UINT cchMax)
这个方法...
这个方法的作用是把menu的ID和其字符串对应起来的
#23楼 得分:0 回复于:2008-07-25 10:46:55
#24楼 得分:0 回复于:2008-07-25 11:00:47
好好看一下那个例子。。。
我邮箱rr.tj.sse@gmail.com
有问题大家可以一起讨论 :)
#25楼 得分:0 回复于:2008-07-25 11:01:42
#26楼 得分:0 回复于:2008-07-25 11:47:38
搞定了,谢谢,菜单问题差不多了,现在有个关键的问题,比如现在我在联系人添加了个自己的菜单,在菜单响应怎么获得目前联系人的信息呢,比如名称,电话等
#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
#28楼 得分:0 回复于:2008-07-25 14:11:23
联系人这个com有用过,现在问题在于,比如现在点桌面右下角的联系人,进入联系人界面,而且我的菜单已经嵌 入联系人菜单中。比如联系人有3个联系人,"张三","李四","王五",然后我选择"李四"这个联系人,弹出菜单,这时候我的菜单处理函数要如何获得我 当前选择的是"李四"呢?
#29楼 得分:0 回复于:2008-07-26 11:13:04
#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。