WinCE开始菜单定制(二)

    技术2025-11-14  10

    前面转了一篇关于添加应用程序到开始菜单的帖子,可以将应用程序添加到开始的菜单的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的更简单的方式,但我现在还没找到,知道的请告诉我一声,非常感谢。

    最新回复(0)