前面转了一篇关于添加应用程序到开始菜单的帖子,可以将应用程序添加到开始的菜单的Programs目录或Favorites等。
正好今天接了个需求,客户需要将应用程序添加到开始菜单的第一级。也就是跟Programs平级的地方。开始以为也就是换个目录而已。后来发现不是,需要更改WinCE的开始菜单代码个资源文件才能做到。花了大半天的时间才搞定,并不在于有多难,而是太不熟悉了。
实现方式如下:
1. 首先打开如下文件(在PB的FileView的public-->shell-->oak-->hpc-->explorer-->taskbar-->Source Files-->stmenu.cpp):
物理位置是/WINCE500/PUBLIC/SHELL/OAK/HPC/EXPLORER/TASKBAR/stmenu.cpp
找到
WCHAR const c_szCable[] = L"//windows//peghelp.exe";WCHAR const c_szBluetooth[] = L"//windows//peghelp.exe";
static STMENUDATA const stmenuData[] = { {IDM_START_CABLE, IDS_CABLE, IDI_CABLE, STATIC_ITEM, 0, 0, 0}, {IDM_START_BLUETOOTH, IDS_BLUETOOTH, IDI_BLUETOOTH, STATIC_ITEM, 0, 0, 0},// {IDM_START_CABLE, IDS_MENURUN, IDI_STRUN, STATIC_ITEM, 0, 0, 0},// {IDM_START_BLUETOOTH, IDS_MENURUN, IDI_STRUN, STATIC_ITEM, 0, 0, 0}, {0, IDS_NULL, 0, STATIC_ITEM, 0, 0, 0}, {IDM_START_PROGRAMS, IDS_MENUPROGRAMS, IDI_STPROGS, CSIDL_PROGRAMS, 0, 0, 0}, {IDM_START_FAVORITES, IDS_MENUFAVORITES, IDI_STFAVORITES, CSIDL_FAVORITES, 0, 0, 0}, {IDM_START_DOCUMENTS, IDS_MENUDOCUMENTS, IDI_STDOCS, CSIDL_RECENT, 0, 0, 0}, {IDM_START_SETTINGS, IDS_MENUSETTING, IDI_STSETNGS, STATIC_ITEM, 0, 0, 0}, {IDM_START_HELP, IDS_MENUHELP, IDI_STHELP, STATIC_ITEM, 0, 0, 0}, {IDM_START_RUN, IDS_MENURUN, IDI_STRUN, STATIC_ITEM, 0, 0, 0}, {0, IDS_NULL, 0, STATIC_ITEM, 0, 0, 0}, {IDM_START_SUSPEND, IDS_MENUSUSPEND, IDI_STSUSPD, STATIC_ITEM, 0, 0, 0},};
红色部分是我添加的自定义的菜单信息。
IDM_用来标识菜单,IDS_是菜单显示的字符串,IDI_是菜单前的图标。
DWORD StartMenu_ProcessCommand(HWND hwnd, WPARAM wp, LPARAM lp){ DWORD cmdId = GET_WM_COMMAND_ID(wp,lp); SHELLEXECUTEINFO info;
switch (cmdId) { // Add by xxx
case IDM_START_CABLE: RETAILMSG(1, (L"IDM_START_CABLE processed, id is 0x%x/r/n", cmdId)); info.cbSize = sizeof(info); info.fMask = SEE_MASK_NOCLOSEPROCESS | SEE_MASK_FLAG_NO_UI; info.lpVerb = NULL; info.lpFile = c_szCable; info.lpParameters = NULL; info.lpDirectory = NULL; info.nShow = SW_SHOW; info.hInstApp = NULL; ShellExecuteEx(&info);
break;
case IDM_START_BLUETOOTH: RETAILMSG(1, (L"IDM_START_BLUETOOTH processed, id is 0x%x/r/n", cmdId));
info.cbSize = sizeof(info); info.fMask = SEE_MASK_NOCLOSEPROCESS | SEE_MASK_FLAG_NO_UI; info.lpVerb = NULL; info.lpFile = c_szBluetooth; info.lpParameters = NULL; info.lpDirectory = NULL; info.nShow = SW_SHOW; info.hInstApp = NULL; ShellExecuteEx(&info);
break;
...
上面是菜单的具体功能,我只是简单的打印了一条信息看菜单是否被调用以及打开WinCE帮助文档,可以根据实际需要来实现其功能。
2. 接下来就是添加的菜单信息的定义了。
打开/WINCE500/PUBLIC/SHELL/OAK/HPC/EXPLORER/INC/resource.h
添加:
#define IDI_STTASKBAR 31#define IDI_STCONNMC 32
// Add by xxx
#define IDI_CABLE 33#define IDI_BLUETOOTH 34...
#define IDS_MENUTASKBAR 0x8a0b#define IDS_MENUCONNMC 0x8a0c
// Add by xxx
#define IDS_CABLE 0x8a0d#define IDS_BLUETOOTH 0x8a0e...
#define IDM_START_FAVORITES 20#define IDM_START_LAST_BANNER 20// add by jiangjun 2011-02-16 for add app to startmenu#define IDM_START_CABLE 21#define IDM_START_BLUETOOTH 22
这里千万要注意资源文件的定义,不能重复了。
3.资源头文件中有了信息,现在要做的就是在资源文件中添加了。我就是在这里浪费了很多时间,开始不知道怎么想的,搜了下.res文件就开始改,改来改去发现生成的系统中菜单项是有了,可上面什么也不显示,后来仔细一看,改过的res文件又被改回原样了。所以这里应该修改对应的.rc文件而不是.res文件。
找到:/WINCE500/PUBLIC/SHELL/OAK/HPC/EXPLORER/MAIN/explorerbase.rc
这个很奇怪,用PB修改它后没法用,说什么因为不是PB创建的文件。所以只能用文本方式打开(UE或记事本)
添加红色部分:
// start menu iconsIDI_STPROGS ICON DISCARDABLE "RES//STPROGS_new.ico"IDI_STDOCS ICON DISCARDABLE "RES//STDOCS_new.ico"IDI_STSETNGS ICON DISCARDABLE "RES//STSETNGS_new.ico"IDI_STHELP ICON DISCARDABLE "RES//STHELP.ico"IDI_STRUN ICON DISCARDABLE "RES//STRUN_new.ico"IDI_STSUSPD ICON DISCARDABLE "RES//STSUSPD.ico"IDI_STFAVORITES ICON DISCARDABLE "RES//stfav_new.ico"IDI_STTASKBAR ICON DISCARDABLE "RES//sttaskbr_new.ico"IDI_STCTLPNL ICON DISCARDABLE "RES//stcpanel_new.ico"IDI_STCONNMC ICON DISCARDABLE "RES//remotenw_new.ico"
// Add by xxxIDI_CABLE ICON DISCARDABLE "RES//cable.ico"IDI_BLUETOOTH ICON DISCARDABLE "RES//blutooth.ico"...
// start menuSTRINGTABLE DISCARDABLE BEGIN IDS_CABLE "Cable" IDS_BLUETOOTH "Bluetooth" IDS_MENUPROGRAMS "&Programs" IDS_MENUDOCUMENTS "&Documents" IDS_MENUSETTING "&Settings" IDS_MENUFIND "&Find" IDS_MENUHELP "&Help" IDS_MENURUN "&Run..." IDS_MENUSUSPEND "S&uspend" IDS_MENUFAVORITES "F&avorites" IDS_MENUCTLPNL "&Control Panel" IDS_MENUTASKBAR "&Taskbar and Start Menu..." IDS_MENUCONNMC "&Network and Dial-up Connections"END
4.将3中需要的ico文件拷贝到:
/WINCE500/PUBLIC/SHELL/OAK/HPC/EXPLORER/MAIN/RES/目录下。
5. 在PB的File View中右键选择shell,先保证右键菜单的Clean Before Building和Make Run-time Image After Building勾选,然后右键菜单选择Build and Sysgen Current Project。
OK,现在开始菜单的Programs上面多了两个菜单和一个分隔符了。
今天改变了一下系统的语言为日语后发现菜单又没有图标和内容了。这个郁闷了,估计是对应的语言资源里面没有菜单的信息。于是在
D:/WINCE500/PUBLIC/SHELL/OAK/LIB/X86/RETAIL/0411
中找到explorerbase.res用PB打开,添加菜单需要的图标和字符串,验证后OK。
也就是说多语言的操作系统的话,必须对所有的语言的explorerbase.res都做上面的添加。否则菜单就没有图标和字符串显示。
也许存在不要修改全部需要语言的explorerbase.res的更简单的方式,但我现在还没找到,知道的请告诉我一声,非常感谢。
