欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  移动技术

如何定制Windows Embedded Compact 7 shell详解(上)

程序员文章站 2022-07-08 13:07:44
1.定制Windows Embedded Compact 7  shell   Shell 是用户访问操作系统的接口。Shell 开发在 Windows E...
1.定制Windows Embedded Compact 7  shell

 

Shell 是用户访问操作系统的接口。Shell 开发在 Windows Embedded Compact 7操作系统开发中占据一定的重要性。对Windows Embedded Compact 7  Shell 进行了概述,并通过建立 Shell 模型,讲述如何自定制Windows Embedded Compact 7  和定制Shell 必须注意的问题,对 Windows Embedded Compact 7  Shell 的定制进行深入研究。

 

1.1  可定制的Windows Embedded Compact 7 Shell

 

1.1.1  什么是Shell

 

Windows Embedded Compact 7  Shell 为用户运行设备商的应用程序和管理 Windows Embedded Compact 7  操作系统对象提供了一个接口,这些对象既可以是位于目标设备上的实际对象,如文件和文件夹,也可以是虚拟对象,如回收站。Windows Embedded Compact 7 Shell 是 Windows Embedded Compact 7  操作系统主要的图形用户接口,是Windows Embedded Compact 7  启动后的第一个图形界面窗口。标准的Windows Embedded Compact 7  Shell 包括众所周知的,如任务栏和开始菜单的 Windows 组件。由于不同嵌入式设备对系统和应用的要求不同,因此嵌入式设备需要自定制系统。Windows Embedded Compact 7  允许开发者对 Shell 进行定制,允许开发者为自己的目标设备实现简单的命令行接口,或是完全定制的图形用户接口 Shell。由于 Windows Embedded Compact 7  Shell定制是 Windows Embedded Compact 7  系统定制中最具特色的一部分,Shell 的定制尤显重要。

 

1.1.2  Shell模块和组件

 

表1-1对实现Windows Embedded Compact 7 Shell的模块和组件进行了总结。

 

表1-1 Shell模块和组件

 

Shell条目

 

模  块

 

组  件

 

Shell

 

Coredll( Shell API)

 

accel_c, rectapi, wmgr_c mgdi_c, shcore, shortcut shexec,  shmisc,  fileopen  fileinfo,   Shellapis.

 

Commdjg (常用对话框)

 

Nonc

 

Commctrl(常用控件)

 

toolbar. updown. stacus. Propsheet listview. creeview, dace.tab. Progress. trackbar. capedit rebar, cmdbar, dsa, tooltips

 

Srandard Sbell

 

Cplmain(主控制面板)

 

network, datetime, keyboard, password. Owner, power system, display, pointercmn. mouse

 

control(控制面板的架构)

 

None

 

ctlpnl (控制面板的文件夹视图)

 

None

 

asform(手持PC Shell支持)

 

None

 

ceshell {Windows Shell)

 

None

 

explorer(资源管理器)

 

None

 

Taskman  Stmple  Shell

 

mskman(任务管理器)

 

None

 

Wtndows Thin C Lient SheLl

 

ceshell(手待PC Shell支持)

 

None

 

ctUpnt (控制面板的文件火视图)

 

None

 

表1-2是用于Windows Embedded Compact 7 Shell的SYSCGEN变量。

 

表1-2Shell的SYSGEN变量

 

SYSGFN变量

 

描述

 

SYSGEN_AYG SHELL

 

用于在Windows Embedded Compact 7 OS 中包含AYGShell API扩展,用于支持在 Windows Embedded Compact 7上运行Pockel PC Shell应用程序

 

SYSGEN_COMMCTRL

 

用于在Windows Embedded Compact 7 OS 中包含常用控制功能

 

SYSGEN_ COMMCTRL_ANIMATE

 

用于在Windows Embedded Compact 7 OS 中包含动画控制功能

 

SYSGEN_COMMDLG

 

用于在Windows Embedded Compact 7 OS中添加对带用对话框的支持

 

SYSCTEN_CTLPNL

 

用于在Windows Embedded Compact 7 OS中添加对控制面板的支持

 

SYSGFN_PPS

 

用于使Windows Embedded Compact 7 OS支持控制选项B.使Windows Embedded Compact 7 OS 中的一些Pocket PC控件与Windows Embedded Compact 7设备兼容。控件选项B为默认支持Windows Embedded Compact 7 标准控件的选项

 

SYSOEN_QVGAP

 

用于在Windows Embedded Compact 7OS中添加对竖向VGA资源(竖放模式)的支持

 

SYSOEN_STANDARDSHELL

 

用于在Windows Embedded Compact 7 OS中包含标准Shell功能

 

SVSGEN_WBTSHELL

 

用于在Windows Embedded Compact 7 OS中包含瘦客户端Shell功能

 

1.2  Windows Embedded Compact 7提供的Shell选项

 

Platfo rm B uilder提供了三个Shell选项:

 

·  命令行Shell(Command Shell);

 

·  标准Shell(Standard Shell);

 

·  Windows瘦客户端Shell(Windows Thin Clicnt Shell);

 

任务管理器例Shell(Taskman Sample Shell)。为了为基于Windows Embedded Compact 7的设备提供一个Shell,开发者可以选择上述Platform Builder提供的任何一个Shell或者以这几种Shell为基础开发自己定制的 Shell。

 

1.2.1  Windows Embedded Compact 7命令行Shell

 

对于许多设备,包括那些没有显示的设备,Windows Embedded Compact 7包含了一个类似于Windows2000/XP下的Cmd.exe的命令行处理器Shell,它是一个提供了有限儿个命令的命令行驱动的Shell。为了在一个特定的平台上实现命令行处理器Shell,需要在这个平台的Cesysgen.bat文件中包含Cmd和ConSole组件。为了使用命令行处理器作为一个没有显示设备的命令行接口,可以通过配置命令行处理器来操作串口。下面的例代码展示了如何通过设置注册表值来允许命令行处理器通过串口进行操作。

 

    {HKEY_LOCAL_MACHINE\Drivers\Consolc}

 

         OutputTo= REG _DWORD:1    ∥将CMD重定向到COMI

 

         COMSpeed= REG_DWORD:19200    ∥串口连接的速度

 

除非明确地将所有控制台应用程序的输入和输出配置为重导向到一个文件或其他设备,否则这些注册表设置将所有控制台应用程序的输入和输出配置为重导向到串口。

 

控制台应用程序没有图形用户界面并限于使用标准的c语言库I/O函数,例如从命令行读/写字符的printf相getc函数等。

 

1.2.2 标准Shell

 

Windows Embedded Compact 7标准Shell是由Windows Embedded Compact 7 早期版本的手持PC Shell(被称为HPCShell)发展过来的,类似于基于Windows桌面操作系统的Shell,它为访问文档、运行应用程序、任务之间切换、浏览文件系统和执行其他的服务提供了一个熟悉的界面,为了将它包含到开发者基于Windows Embedded Compact 7的设备,需要将“Standard Shell”组件添加到操作系统设计中。

 

标准Shell支持240×320(QVGA)或者更大的屏幕显示分辨率,并支持Windows Embedded Compact 7标准CDK。

 

Platform Builder在﹪_WINCEROOT﹪\Public\Shell\OAK\HPC 文件夹下提供了标准Shell的源代码,这些源代码已经被集成到了所有文件标准Shell的操作系统设计里面,一般建议用户不要修改这些源代码。在进行操作系统的设计时,当在“New Platform”向导的“Available design templatcs”列表中选择了“Enterprise Web Pad”、 “Intemet Appliance”或“Set—top Box”时都会默认加载标准Shell。在操作系统启动时,标准shell作为一个进程Explocr.exe被加载。

 

1.2.3  Windows 瘦客户端Shell

 

Windows瘦客户端有时也被叫做基于Windows的终端(Windows-Based Terminal.WBT),在我国也被称为网络计算机,它是一种以服务器为中心的客户端/服务器(C/S)网络解决方案,是以Windows Embedded Compact 7  为操作系统的计算机终端设备。作为终端,Windows瘦客户端在使用时必须要连接服务器,用户要使用的软件全部被安装到服务器上。Windows瘦客户端操作系统的主要任务是先将本地的瘦客户端设备引导起来,与服务器建立RDP(或ICA)连接,并将服务器上的串口、并口、音频端口等映射到瘦客户端的对应端口,然后显示服务器界面,接收本地键盘和鼠标等地输入并将输入信息传送给服务器对应的程序。Windows 瘦客户端的操作系统通常是由Windows Embedded Compact 7 操作系统内核、远程桌面协议(Remote Desktop Protocol.RDP)和其他组件构成的一个小型Windows Embedded Compact 7 操作系统。

 

在Windows瘦客户端启动时,WBTShell.exe作为瘦客户端Shell被加载,同时WBTWizd.exe被作为连接服务器向导应用程序被加载。

 

在微软提供的Windows瘦客户端Shell及其相关组件的源代码中,即使是中文的资源文件,仍有很多界面的资源文件中的字符串足以英文形式提供的,在开发过程中,这需要开发者自己去修改相应的,rc文件,用中文字符串代替英文字符串。由于微软提供了Windows瘦客户端Shell及其相关组件完整的源代码,开发者完全可以修改这些源代码,在控制面板中添加附加功能,如添加本地打印机映射设置、添加客户端的 IC卡认证等功能。

 

1.2.4 任务管理器例Shell

 

任务管理器例Shell不是为用户的最终产品而设计的,它仅仅是微软为了帮助开发者定制自己的Shell而设计的,以它为起点可以大大降低开发难度并加速开发进程。

 

任务管理器例 Shell展示了如何实现一个具有桌面和任务管理器窗口的Shell界面,开发者可以以此为起点进一步定制一个全功能的Windows Embedded Compact 7 Shell。Platform Builder在%_WINCEROOT% \Public\Wceshellfe\Oak\Taskman丈件夹下给出了任务管理器倒Shell的源代码,开发者可以修改这些源代码以适应自己的Windows Embedded Compact 7设备平台。

 

任务管理器例Shell主要提供了下列功能:

 

(1)创建一个全屏幕的桌面窗口。

 

任务管理器例Shell创建了一个全屏幕的桌面窗口和零高度的任务条窗口,这两个窗口在GWES被注册,并可以使某些窗口被隐藏在桌面窗口之后,快捷键ALT+TAB、CTRL+ESC和CTRL+ALT+BACKSPACE用来向任务条窗口发送消息。

 

(2)提供一个任务管理器窗口界面。

 

任务管理器窗口是列出所有正在运行的应用程序的项层窗口,用户可以使用它切换或者停止一个应用程序,快捷键ALT+TAB、  CTRL+ESC和CTRL+ALT+BACKSPACE用来调用任务管理器窗口。

 

    (3)提供一个“运行”按钮。

 

“运行”按钮用于使用户可以通过它运行一个应用程序或文件。为了加载任务管理器例Shell,开发者只需要设置环境变量SYSGEN_TASKMAN=1,并重新创建操作系统运行时映像即可。

 

1.3  Shell定制开发的选项

 

通常,Windows Embedded Compact 7 Shell 的定制开发有两个选择:将一个单独的应用程序作为基于Windows Embedded Compact 7设备的Shell:  将浏览器作为基于Windows Embedded Compact 7 设备的Shell。

 

1.3.1 应用程序作为Shell

 

任何类型的Windows 应用程序(.exe)都可以被作为基于Windows Embedded Compact 7 设备的Shell。典型情况下,如果开发者的设备是一台单一功能的设备,且它只运行一个用户应用程序,那么将这个用户应用程序作为Shell是一个最好的选择。在其他情况下,开发者也可能开发一个Win32 或MFC 形式应用程序,并将它作为一个高度定制化的Shell。

 

1.3.2 浏览器作为Shell

 

将IE浏览器动态Web 页面作为一个标准的桌面来代替标准的Windows桌面是近年来的一种新发展趋势,它的主要优点是用户可以很容易地创建和维护自己的用户界面。浏览器作为Shell就是使用动态的HTML(DHTML)来创建一个高度定制,可动态变化的Windows Embedded Compact 7用户界面。由于桌面版的IE浏览器与Windows Embedded Compact 7的IE浏览器都支持DHTML,所以浏览器Shell界面的开发,显示和测试都可以先在桌面计算机上进行,开发完成后再将它打包到Windows Embedded Compact 7操作系统运行时映像进行最后的测试,这可以大大加快发开的进程。

 

1.4  必要的Shell功能

 

一个定制的Shell一般需要由以下四项组成:

 

·Shell应用程序;

 

·桌面窗口;

 

·任务条窗口;

 

·任务相关的消息处理器。

 

1.4.1  Shell应用程序

 

为了创建一个定制的She]l,必须首先创建一个Shell应用程序,Shell应用程序是由两个主要窗口组成的。

 

(1)桌面窗口。桌面窗口显示壁纸和快捷键。

 

(2)任务条窗口。任务条窗口接受窗口创建或窗口删除以及键盘特定键被按下的通知。

 

在设计Shell应用程序时,必须为桌面窗口和任务条窗U创建~个WindowProc函数来处理窗口消息。当Shell应用程序完成初始化时,它还需要调用Signal Started函数,并将操作系统传递给Shell应用程序的顺序ID传递给它,这个函数朋来通知系统Shell已经启动.且初始化已经完成。SignaIStarted函数的定义如下:

 

VOiD SignaiStaned(DWORD dwSequenceID)

 

其中,dwSequenceID是操作系统传递给Shell应用程序命令行的一个十进制数字标识符。

 

1.4.2桌面窗口

 

桌面窗口用来显示桌面擘纸并放置快捷方式图标,它总是设备的最底层窗口,单击它并不会将它放到所有其他窗口的最前面。在实现桌面窗口时,开发者可以通过设置注册表HKEY_ CURRENT_ USER\Contro IPanel\Desktop键的下列注册表键设置当前桌面壁纸:

 

·Wallpaper [REG_SZ];

 

·TILE [REG_DWORD]。

 

其中,Wallpaper键用来定义壁纸位图文件的文件名,TILE键用来定义是否平铺壁纸。

 

当用户改变桌面壁纸设置时,PostMessage函数的wparam参数被设置为1或者以SPI_SETDESKWALLPAPER作为附加信息的WM_SEITNGCHANGE窗口消息被广播,这样桌面窗口就会感知到这个消息并更换壁纸:同时,控制面板会使用这些注册表键设置。

 

由Shell应用程序创建的桌面窗口必须是全屏幕、不透明的,并有一个特定的窗口类名:DesktopExplorerWindow,而且在一台Windows Embedded Compact 7设备上只能有这个窗口类的一个窗口实例。

 

1.4.3  任务条窗口

 

一个Shell应用程序可以通过一个窗口句柄调用RegisterTaskBar函数注册一个任务条窗口,然后这个窗口接收窗口产生、关闭和激话的通知,同时,它也会接收用于特定功能的键序列,如开始菜单、任务管理器等。任务条窗口在窗口管理器中注册自己,然后使用Register TaskBar函数接收来自于窗口管理器和输入系统的通知。当函数RegisterTaskBar被调用时,窗口管理器寻找窗口类为DesktopExplorerWindow的顶层窗口,操作系统的窗口系统使用这个窗口作为桌面窗口。

 

RegisterTaskBar函数的原型如下:

 

BOOL  RegisrerTaskBar( HWND  hwndTaskBar);

 

下面的代码片段创建、注册并显示一个任务条窗口:

 

    hwndTB= CrcateWindow(HHTASKBARCLASSNAME, TEXT(""),

 

                      dwStyle, rc.left. rc.top, rc.right-rc.left,

 

                  rc.bottom-rc. top,NULL.NULL. g_hlns, NULL):

 

    if(!RegisterTaskBur(hwndTB))

 

          retum FALSE;

 

    ∥更新并重画任务条

 

    InvalidateRect(hwndTB,O,TRUFi);

 

    ∥显示任务条窗口

 

    ShowWindow(hwndTB.SW_SHOWNORMAL);

 

值得注意的是在任何系统中RegisterTaskBar函数只能由一个应用程序调用一次。

 

1.4.4任务相关的消息处理器

 

任务条窗口接收由GWES的窗口管理器发送的WM_SHELLNOTIFY消息通知代码,并处理发送通知的窗口。通常由 GWES经由WM_SHELLNOTIFY发送给Shell的通知包括以下内容:

 

(l)SHELLNOTIFY_WINDOWCREATED

 

当使一个包含在任务条的窗口可见时发送这个通知,Lparam参数是这个可见窗口的句柄。

 

(2) SHELLNOTIFY_MNDOWDESTROYED

 

当使一个包含在任务条的窗口隐藏或关闭时发送这个通知,Lparam参数是这个隐藏或关闭窗口的句柄。

 

(3) SHELLNOTIFY_WINDOWACTIVATED

 

专使一个包含在任务条的窗口显示在所有其他窗口之上时发送这个通知,Lparam参数是这个最前端窗口的句柄。

 

(4)SHELLNOTIFY_REDRAW

 

当一个包含在任务条的窗口文本发生变化时发送这个通知,触发更新任务条按钮。

 

(5)SHELLNOTIFY_CAPSLOCK

 

当键盘的人写字母锁定键(CapsLock)切换刚发送这个通知,Lparam参数是CapsLock键的状态标志。如果打开了CapsLock键,这个标志被设置为KeyStateToggledFlag。

 

1.5  Shell组件  

 

1.5.1  常用对话框和常用控件

 

Windows Embedded Compact 7常用对话框是Shell应用程序用来维护一个常见的Shell外表而用到的对话框,打开、保存、颜色和打印对话框都是常用对活框的例子。Windows Embedded Compact 7 Shell用到的常用控件用于使Shell保持一致的样式,包括多选框、命令条、命令按钮、列表框、列表视图、菜单、单选按钮、滚动条、选项卡、文本框、工具条、树状视图等。

 

1.5.2控制面板

 

控制面板提供了对用于配置系统的控制面板臆用程序的访问,这些应用程序包括背光、色彩模式、显示、键盘、鼠标、网络、用户、密码、屏幕校准、电源、区域、声音和系统设置等。在Windows Embedded Compact 7 中,控制面板系统是由Ctlpnl.exe、Control.exe和控制面板集合文件(.cpl文件)三部分组成的,其中Ctlpnl.exe和Control.exe是分别控制控制面板文件夹视图平口结构的操作系统可执行文件,而.cpl是提供控制面板功能的应用程序为了创建自己的控制面板应用程序,开发者必须创建一个导出必要回调函数的.cpl文件以适应由Control.exe建立的架构。

 

控制面板应用程序足具有.cpl扩展名的DLL文件,它导出函数CPIApplet来处理CPL_INIT、CPL_GETCOUNT、CPL_NEWINQURE、CPL_STOP芹口CPL_EXIT消息。当用户运行控制面板时,操作系统通过自动在\Windows文件夹下寻找具有.cpl扩展名的文件来加载控制面板。

 

在开发一个定制的Shell应用程序时,开发者既可卧使用标准控制而板应用程序,也可以开发一个定制的控制面板应用程序。标准控制面板应用程序的源代码位于%_WINCEROOT%\PUB LIC\WCES HELLFE\OAK\CTLPNL文件夹下,开发者可以修改它以创建一个定制的控制面板应用程序。

 

1.6  安装运行一个定制的Shell

 

 一旦开发好了一个定制的Shell,就可以通过注册表在目标设备上安装这个Shell,下面的例子展示了安装。一个名为MyShell.exe的Shell应用程序的注册表设置:

 

    {HKEY_LOCAL_MACHINE\lnjc}

 

       Launchxx=“MyShelI.EXE”

 

       Dependsxx= hex:14. 00, lc. 00

 

当Windows Embedded Compact 7 启动时,它顺序执行Launchxx键。开发者定制的Shell应该被放置到列表的最后并使xx为列表中的最大伉,同时定义对应的Dependsxx键,Dependsxx键列出与前面所加载进程相关的顺序号,以便所有定义的相关进程加载成功之后再进行加载开发首定制的Shell进程。

 

例如,开发者定制的Shell进程被注册为Launch60,且Depends60键列出了开发者定制的Shell进程运行之前必须初始化和执行的进程组件,如下:

 

    Launch60=”MVSheIl.EXE”

 

    Deperlds60= hex:14. 00,1e,00

 

其中,60指出了操作系统应该运行MyShell.exe的顺序,它是一个十进制数,Depends60指出在MyShell.exe运行之前,Launch20(十进制的20对应于十六进制的14)和Launch30(十进制的30对应于十六进制的le)必须完全成功运行并完成。通常情况下,Launch20对应于Device.exe,Launch30对应于Gwes.exe,开发者定制的Shell进程至少必须在这两个进程完全运行之后才能进行加载。

 

在系统引导时通过Init键加载运行的应用程序必须在完成初始化后调用SignaIStarted函数,这将通知内核相关的应用程序已经加裁成功。如果SignaIStarted函数调用失败,那么在Init键下与这个应用程序相关的任何应用程序都将不会启动。SignaIStarted函数的调用方式如下:

 

int WinMain(HINSTANCE hlnst, HINSTANCE hPrevlnst. LPWSTR lpCmdLine, int nCmdShow)

 

  SignalStarted(_wtol(lpCmdLine));

 

    ∥…

 

    )

 

在加载Init键下的应用程序时,操作系统会传递一个“令牌”作为命令行参数给应用程序,然后这个命令行参数在被转换为一个整数后再传递给SignaIStarted函数。所以,在编写由Inil键加载的应用程序(如上丽的MyShell.exe)时,开发者役有必要再为这个应用程序添加任何命令行参数,而只需要以上面代码方式直接调用SignaIStarted函数即可。万一开发者需要添加其他命令行参数,那么只能通过读取应用程序特定的注册表来实现了。