【译】菜单的扩展性 ( 以下内容适用平台 Microsoft Windows CE 5.0 )

日历,任务,联系人应用程序都支持外部程序对其进行菜单项的添加。每一个你插入的菜单项都会显示在 Tools (工具)菜单里。当一个菜单项被选择的时候,将调用一个已注册的动态连接库 (DLL) 并传递那些在应用程序里被选择的项目的对象 ID

要注册你的应用程序,你必须在HKEY_LOCAL_MACHINE root 创建一个注册键值。此键值应该存在于Software\Microsoft\PimApps\PimExtensions\ PIMAPP\AddIns 中,其名称可以由你随便定。因为有可能不止一个程序对菜单项进行了插入操作,为了避免菜单项的冲突,建议你在取名字的时候能够加入一些个性化的标示信息,比如你公司的名称等。

上述例子中的 PIMAPP 应该用 Contacts,Tasks, 或者 Calendar 来替换掉,这取决于你需要修改那个程序的菜单。

键需要两个实体,第一个就是 DLL ,它的名称应该是你 DLL 的名称,第二个是 Menu ,它的制应该你你希望显示在菜单中的菜单项文字。还是那句话,因为可能不止一个程序要去添加菜单项,所以为了避免冲突,还请采用个性化标识。比如说,如果你制作了一个电话的拨号程序,并且要再联系人程序中添加调用此程序的菜单项,那么你可能需要创建一个注册键 Software\Microsoft\PimApps\PimExtensions\Contacts\AddIns\MicrosoftDialer .

下面的代码例子显示了可能的注册键所需要的两个实体:

DLL\"dialer.dll" Menu\"Dial Contact"

你要注册的 DLL 必须expose 下面的函数,此函数应该在用户选择你的菜单项后被调用。

void CePimCommand (HWND hWnd, PIMTYPE ptData, UINT uDataCount, HANDLE *rghData, void *pReserved);

PIMTYPE 是一个枚举类型,定义如下:

typedef enum tagPIMTYPE {
PT_CALENDAR = 0,
PT_TASKS,
PT_CONTACT } PIMTYPE;

参数

解释

hWnd

应用程序窗口句柄

ptData

应用程序调用此函数

uDataCount

rghData 数组中的项目个数

*rghData

当前被选中项目的对象 ID 数组

*pReserved

保留参数,在此版本中为NULL

你可以从菜单项的对象 ID来操作或者使用这些项目,通过在 Application 对象中调用 GetItemFromOid

 
=================================================================================
 
其他相关资料:
 
需要像outlook一样,在file explorer的softkey menu 和shortcut menu中添加菜单项。添加shortcut menu已经实现了,但是找不到如何添加softkey menu的资料,请各位高手指教。
在msdn上有一篇文章介绍如何加softkey menu,但是其中没有讲如何添加file explorer的softkey menu。文章链接如下:
http://msdn2.microsoft.com/en-us/library/ms879952.aspx

下面是关于如何往Contacts中添加一个右软键菜单的例子:
http://msdn2.microsoft.com/en-us/library/ms880658.aspx
 

1 Hook keyboard ,判断如果是联系人列表 弹自己的menu ,至于如果获得用户选择的联系人号码需要一点点技巧
  我是这样做的:读联系人列表选择的index 然后读contacts database取用户的mobile phone
2 替换联系人列表的默认menu bar 这个没有玩过

得到联系人的号码后 自己给号码前 增加17951  然后拨号就可以
一个事例 可以参考我的程序 《手机按键精灵》 http://www.spbase.com

替换联系人列表的默认menu bar 这个没有玩过

这个只能是猜测,因为我没有实际做过

取得联系人windows handle SHFindMenubar 得到菜单句柄 然后
这段代码在自己的app可以运行 你可以运用一个简单的技巧 让联系人窗口运行这段代码

HWND hMenuBar = SHFindMenuBar(m_hWnd);
HMENU hPopupMenu = SHGetSubMenu(hMenuBar, ID_WORK);
for(int i=0;i<MENU_COUNT;i++)
RemoveMenu(hPopupMenu, 0, MF_BYPOSITION);

AppendMenu(hPopupMenu, MF_BYPOSITION, ID_IMPORT_ONE_LIST, StringFromResources(IDS_ADD_SELECT)); 

posted @ 2009-04-17 16:20  上海啸傲  阅读(371)  评论(0编辑  收藏  举报