WinCE开始菜单定制(二)

来源:互联网 发布:ios知乎日报 api 编辑:程序博客网 时间:2024/05/16 15:14

前面转了一篇关于添加应用程序到开始菜单的帖子,可以将应用程序添加到开始的菜单的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 icons
IDI_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 xxx
IDI_CABLE               ICON    DISCARDABLE     "RES//cable.ico"
IDI_BLUETOOTH           ICON    DISCARDABLE     "RES//blutooth.ico"
...

 

// start menu
STRINGTABLE 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的更简单的方式,但我现在还没找到,知道的请告诉我一声,非常感谢。