shell开发,是系统开发的一个部分。最明显的是Shell的代码,是属于BSP的一部分。需要使用PB,而不是EVC或VS2005!
wince下shell 的定制
http://blog.csdn.net/fanyw/archive/2009/11/12/4804547.aspx
首先我们需要了解下定制shenll的整个流程:
1、shell可以从两个方面来定制:
a 将一个独立的应用程序作为基于wince设备的shell,任何类型的windows应用程序(.exe)都可以被作为基于wince设备的shell,如果开发者的设备是一台单一功能的设备,且它只进行一个用户应用程序,那么将这个用户应用程序作为shell是一个最好的选择,对于这种处理的方法就是 自己制作一个.exe文件来代理wince自带的shell,在wince启动的时候通过修改注册表platform.reg来引导.exe文件,注册表如下修改:
只要将MyApp.exe打包到NK,并在platform.reg中加入上面的注册表信息,这样WinCE启动时便会自动运行该程序。
b 将浏览器作为基于wince设备的shell。将IE浏览器动态web页面作为一个标准的桌面来代替标准的windows桌面是近年来的一个新发展趋势,它的主要优点是用户可以很容易地创建和维护自己的用户界面。浏览器作为shell就是使用动态的HTML来创建一个高度定制、可动态变化的wince用户界面。由于桌面版的IE浏览器与wince的IE浏览器都支持DHTML,所以浏览器shell界面的开发、显示和测试都可以先在桌面计算机上进行,开发完后再将它打包到wince操作系统运行时映像进行最后的测试,这可以大大加快开发的进程。
2、在了解了shell定制的方法后我们先来看下最初始的shell界面如下图:
这个是wince系统默认的shell界面(通过我前面那篇文章就可以生成这个模拟器),下面我们一步步通过手术来简单修改shell
首先我们可以去掉默认界面的My Device和回收站方法如下:
打开注册表shell.reg (D:/WINCE600/PUBLIC/SHELL/OAK/FILES)只要在
[HKEY_LOCAL_MACHINE/Explorer/Desktop]
"{000214A0-0000-0000-C000-000000000046}"="My Device"
"{000214A1-0000-0000-C000-000000000046}"="Recycle Bin"
前面添个分号“;”就可以了,如下:
[HKEY_LOCAL_MACHINE/Explorer/Desktop]
;"{000214A0-0000-0000-C000-000000000046}"="My Device"
;"{000214A1-0000-0000-C000-000000000046}"="Recycle Bin"
这样再次编译过后就是这样的shell了
接下来我们在修改界面中间的那个图片
打开public/shell/oak/myshell/ceshell/ui/desktopview.cpp,(这里要先说下为了避免不可挽回的错误建议大家不要在原来的HPC上修改,而在同一目录下建个文件夹将HPC内的内容全部copy过来,然后将oak目录下的dirs文件路径改为你的文件名,我的是将HPC改为myshell),找到
::wsprintf(wszVersion, L"Windows Embedded CE v%d.%02d (Build %d on %s) ",
VerInfo.dwMajorVersion, VerInfo.dwMinorVersion, VerInfo.dwBuildNumber, TEXT(__DATE__));
看到了吧输出信息就是wince的版本信息,好了我们将他替换,如我Windows Embedded CE v%d.%02d (Build %d on %s)换为“This is me”,修改后保存,然后点击myshell文件夹右键选择build and sysgen,喝杯茶等等系统内核编译好了,配置连接选项后连接设备,可以输出下图:
这里好像不支持中文输出,应该是系统语言设置的问题,~~~看下面的乱码
现在整个流程都弄清楚了,接下来就是细化ui下的代码了,额有错误的地方望不吝赐教,相互学习、共同进步。
[HKEY_LOCAL_MACHINE/init]
"Launch50"="MyApp.exe"
"Depend50"=hex:14,00,1e,00
WinCE自启动Shell的问题
http://www.cnblogs.com/we-hjb/archive/2008/12/28/1364070.html
WinCE开机即运行定制的Shell是很多系统的基本要求,有时还需要屏蔽WinCE自带的Shell。WinCE中程序的自启动,一般有两个实现方法,修改注册表和添加自启动快捷方式。修改注册表比较方便,如下:
[HKEY_LOCAL_MACHINE/init]
"Launch70"="MyApp.exe"
"Depend70"=hex:14,00,1e,00
只要将MyApp.exe打包到NK,并在platform.reg中加入上面的注册表信息,这样WinCE启动时便会自动运行该程序。但这时WinCE自带的Shell总是先出来,然后才运行MyApp.exe,为了避免这种情况,我们可以将注册表设置修改如下:
[HKEY_LOCAL_MACHINE/init]
"Launch50"="MyApp.exe"
"Depend50"=hex:14,00,1e,00
即将原来启动explorer.exe的值换为MyApp.exe。这样WinCE启动时直接进入定制的Shell,而不启动explorer.exe。但这时有可能引入了新问题,如果定制的Shell是基于MFC编写的,并且其中用到了如CFileDialog等类库时,就会出现意想不到的情况,如下图所示:
上图是在不启动Explorer.exe时,尝试导入注册表文件出现的状况截图,而在启动explorer.exe时是没有问题的。这说明CFileDialog在某种程度上依赖于explorer.exe,具体细节没研究。但说明不启动explorer.exe,基于MFC的Shell运行时就可能会出问题。所以explorer.exe必须启动,但又不能出现WinCE界面。要解决这个问题自然就想到修改explorer.exe了。WinCE5.0和WinCE6.0中,这一部分的代码都是公开的,在WinCE6.0中Shell的相关代码在C:/WINCE600/PUBLIC/SHELL/OAK/HPC/EXPLORER/MAIN目录下。
大致看了一下这一部分的代码,发现只需修改如下两个文件,就应该能实现需求。
C:/WINCE600/PUBLIC/SHELL/OAK/HPC/EXPLORER/MAIN/desktop.cpp
C:/WINCE600/PUBLIC/SHELL/OAK/HPC/EXPLORER/MAIN/explorer.cpp
修改完这两处后,先编译该目录,然后再重新编译整个系统(执行Sysgen)应该就可以了。Explorer.exe依然启动,依然可以听到WinCE启动的声音,但WinCE的界面已经屏蔽掉了。此时,基于MFC的Shell也能正常工作,如下图所示:
在实际操作时,我没有通过修改源代码编译来完成这个测试。因为在编译C:/WINCE600/PUBLIC/SHELL/OAK/HPC/EXPLORER/MAIN目录时,发现它只生成了explorer.lib。考虑到重新编译整个系统的时间太长,所以直接修改了工程目录下的explorer.exe的文件,MakeImg后测试的。这里应该有快速编译的方法,但目前不知怎么弄。
修改后,在WinCE6.0的模拟器中测试,达到了预想的效果。这样就大概解决了基于MFC的Shell和Explorer.exe之间的矛盾,是不是有隐患还不清楚,目前看来没问题。
另外需要注意,修改public和private目录下的文件时,一定先做好备份,以免后患。
修改后的WinCE6.0的explorer.exe及演示视频的下载地址:
http://files.cnblogs.com/we-hjb/WinCE_Shell.rar
其实让一个程序在wince里启动和windows里差不多,直接设置其为启动项,这个有几个方法。
一个就是制作一个快捷方式,指向我们的应用程序如app.exe,然后将快捷方式放到/windows/startup下面。
步骤如下:(假设app.exe已经拷贝到windows下面)
在pb中创建一个文件,文件类型选txt,然后命名为.lnk后缀,假设名字为test.lnk
编辑其内容为: 16#/windows/app.exe
备注:前面的16是# 后面所有字符的总和,包括空格。Wince的帮助文档上说这么定义就行,但是我尝试后,最后down到目标机上面时提示找不到文件,在wince里查看这么创建的test.lnk的属性,发现其指向/windows/app.exe后面还有两个方框,因此不对,我的解决方法是修改test.lnk的内容为16#"/Windows/app.exe"
编辑好lnk文件内容后在pb中修改project.bib
在files段后面添加下面一行:(和添加别的文件到image中类似,也要在pb的flatform菜单的setting下添加build语句,同上,不再赘述) test.lnk $(_FLATRELEASEDIR)/test.lnk NK S
project.dat增加下面一行:Directory("/Windows/startup"):-File("test.lnk","/Windows/test.lnk")
这样后系统启动后就会自动启动我们的程序了。
另外一种方法是编辑注册表:在project.reg中添加如下内容
[HKEY_LOCAL_MACHINE/init]
"Launch80"="app.exe"
"Depend80"=hex:14,00,1e,00
这个是设定启动顺序,launch后面的数字越大的越是后启动,Depend80后面的指定依赖项,为16进制,上面的语句表明依赖项为launch20定义的device.exe和launch30中定义的gwes.exe, 注意Launch后面的数字范围为0到99 ,此范围之外的将不会有效果。
这样两种方法的效果都是系统都是系统先启动资源管理器explorer.exe(就是看到的默认桌面),然后启动我们的程序,(如果利用taskman shell然后去掉任务栏那么效果更好)但是这样还不够,我们如何不显示桌面,直接显示我们的程序呢?
网上有人介绍的方法是去掉standard shell,但是我编译总是报错。我采用的方法是替换注册表中lauch50中的explorer.exe为我的app.exe,即搞定。
修改注册表的方法:先把带KITL的系统跑起来,在PB的TOOLS->Remote registry editor里修改,验证有效后,再去修改platfrom.reg, 或者自己写个REG文件,然后在platform.reg里INCLUDE进来 SYSGEN后确认PBWORKSPACE里相关项目的REL目录里reginit.ini文件里包含了自己做的修改后make image然后DOWNLOAD下去就OK了。
值得补充的是,我们前面介绍的步骤中那个修改平台setting,添加语句的,是因为我每次都是重新sysgen和build,如果只是简单的make image的话(都是pb中的build OS菜单下的命令),那么将直接用release中的内容,因此也可以直接将文件放到release文件夹,然后改project.bib等实现往image中添加文件。同样,也可以直接修改release中的shell.reg中的launch50值为我们自己的程序(或者类似修改reginit.ini文件,reginit.ini文件存放有所有wince的静态注册表,来达到去掉桌面,直接启动我们程序的效果)。
注意,这么启动的程序,如果点击关闭,就会死机的,因为没有窗口运行了。实际运用中,当然不会让用户关闭我们的程序,除非他一起关闭系统。
如果也需要build的话,可以通过往image中添加文件的方法将我们改好的shell.reg添加到release目录。
总之,今天是把定制shell算是基本完成了。
WinCE下自定义Shell的方法
1. 直接修改Explorer,改为自己的风格。个人认为这是最根本最有效的方法,但是工作量比较大,考虑到时间只能放弃。
[HKEY_LOCAL_MACHINE/init]
"Launch50"="explorer.exe"
"Depend50"=hex:14,00, 1e,00
就是这一句在启动的最后把Explorer启动起来。(Launchxx的含义及用法在PB的帮助里面有解释)。
把explorer.exe替换自己的shell即可(譬如MyShell.exe),以前一直使用这种方法。
但这种方法有缺陷:wince的Common Dialog是依赖于Explorer的,这就导致很多Wince自带的程序执行时有问题,譬如WordPad无法打开和保存。。。(如果哪位知道如何在不启动Explorer的情况下使用Common Dialog的话,还烦请告诉小弟)
a. 复制WINCE500/PUBLIC/SHELL/OAK/HPC,到WINCE500/PUBLIC/SHELL/OAK目录下,并重命名为MyShell unigps.cn
b. 修改dir文件 (修改WINCE500/PUBLIC/SHELL/OAK目录下dir文件,修改如下:DIRS=MyShell/)
c. 去掉桌面上显示的"Microsoft Windows CE...........":
直接把desktopview.cpp(D:/WINCE500/PUBLIC/SHELL/MyShell/CESHELL/UI)中#ifndef SHIP_BUILD改为#if 0即可。
(理论上在Platform Setting里面可以设置此段文字不显示的,但是不知为何不起作用)
d. 修改Taskbar自动隐藏时的高度:
taskbar.hxx中(D:/WINCE500/PUBLIC/SHELL/MyShell/EXPLORER/INC),把TASKBAR_HEIGHT_AUTOHIDE改为0
e. 去掉Explorer启动时的音乐:
把WinMain(D:/WINCE500/PUBLIC/SHELL/MyShell/EXPLORER/MAIN/explorer.cpp)中的sndPlaySound(c_szSystemStart, SND_ALIAS|SND_ASYNC|SND_NODEFAULT);注释掉。
(注册表中,没有找到开机音乐的键值。如果哪位知道,请不吝赐教)
a. Shell.reg(D:/WINCE500/PUBLIC/SHELL/OAK/FILES): 桌面上去掉"My Device"和"Recycle Bin"两个图标
找到
[HKEY_LOCAL_MACHINE/Explorer/Desktop]
"{000214A0-0000-0000-C000-000000000046}"="My Device"
"{000214A1-0000-0000-C000-000000000046}"="Recycle Bin"
改为
[HKEY_LOCAL_MACHINE/Explorer/Desktop]
;"{000214A0-0000-0000-C000-000000000046}"="My Device"
;"{000214A1-0000-0000-C000-000000000046}"="Recycle Bin"
b. 去掉桌面上的其它快捷方式
wince用Directory("/Windows/LOC_DESKTOP_DIR"):-File("LOC_MSPWORD_LNK","/Windows/wordpad.lnk")的方式在桌面上建立快捷方式
把WINCE500/PUBLIC/WCEAPPSFE/OAK/FILES/wceappsfe.dat中的所有Directory("/Windows/LOC_DESKTOP_DIR"):-File(...)全部注释掉。
把WINCE500/PUBLIC/WCESHELLFE/OAK/FILES/wceshellfe.dat中的所有Directory("/Windows/LOC_DESKTOP_DIR"):-File(...)全部注释掉。
c. 设置Taskbar为自动隐藏
在注册表中添加
; -- 使任务栏缺省自动隐藏
[HKEY_LOCAL_MACHINE/Software/Microsoft/Shell/AutoHide]
@="1"
; -- 使任务栏缺省不总在最前
[HKEY_LOCAL_MACHINE/Software/Microsoft/Shell/OnTop]
""=dword:0
d. 修改桌面背景颜色
[HKEY_LOCAL_MACHINE/SYSTEM/GWE]
"SysColor"=hex:/
00,00,00,00,/
00,00,00,00,/ //Desktop窗口背景颜色,现在设置为黑色
00,00,00,00,/
00,00,00,00,/
EF,EB,DE,00,/
FF,FF,FF,00,/
00,00,00,00,/
00,00,00,00,/
FF,FF,FF,00,/
C0,C0,C0,00,/
C0,C0,C0,00,/
80,80,80,00,/
31,69,C6,00,/
FF,FF,FF,00,/
EF,EB,DE,00,/
AD,AA,9C,00,/
80,80,80,00,/
00,00,00,00,/
00,00,00,00,/
FF,FF,FF,00,/
73,6D,63,00,/
FF,FF,FF,00,/
00,00,00,00,/
FF,FF,E1,00,/
EF,EB,DE,00,/
00,00,00,00
e. 背景图片
[HKEY_CURRENT_USER/ControlPanel/Desktop]
"wallpaper"="//NandDisk//Startup//wallpaper.bmp"
f. 启动自己的Shell
[HKEY_LOCAL_MACHINE/init]
"Launch70"="//Windows//ShellLoader.exe"
"Depend70"=hex:14,00, 1e,00
效果:系统启动后,先启动explorer显示wallpaper.bmp,然后启动ShellLoader.exe
wince 界面定制--在shell原码上修改步骤
DIRS=myshell /
进入/WINCE500/PUBLIC/SHELL/OAK目录下,输入:build -c。将myshell文件夹下代码,及wince shell源码进行编译生成.lib及.res文件
ceshell文件夹下创建ceshell_make文件夹,在ceshell_make文件夹下创建makefile和sources文件
makefile文件内容:
!INCLUDE $(_MAKEENVROOT)/makefile.def
sources文件内容:
TARGETNAME=ceshell
TARGETTYPE=DYNLINK
RELEASETYPE=PLATFORM
DLLENTRY=_DllMainCRTStartup
WINCEOEM=1
INCLUDES=../;../../inc
TARGETLIBS= E:/WINCE500/PBWorkspaces/test1/WINCE500/Emulator_x86/cesysgen/oak/target/x86/retail/0409/ceshell.res E:/WINCE500/PBWorkspaces/test1/WINCE500/Emulator_x86/cesysgen/sdk/lib/x86/retail/uuid.lib E:/WINCE500/PBWorkspaces/test1/WINCE500/Emulator_x86/cesysgen/sdk/lib/x86/retail/ole32.lib E:/WINCE500/PBWorkspaces/test1/WINCE500/Emulator_x86/cesysgen/sdk/lib/x86/retail/oleaut32.lib E:/WINCE500/PBWorkspaces/test1/WINCE500/Emulator_x86/cesysgen/sdk/lib/x86/retail/commctrl.lib E:/WINCE500/PBWorkspaces/test1/WINCE500/Emulator_x86/cesysgen/oak/lib/x86/retail/shcore.lib E:/WINCE500/public/shell/oak/lib/x86/retail/aygutils.lib E:/WINCE500/PBWorkspaces/test1/WINCE500/Emulator_x86/cesysgen/sdk/lib/x86/retail/coredll.lib
SOURCELIBS= E:/WINCE500/public/shell/oak/lib/x86/retail/ceshapi.lib E:/WINCE500/public/shell/oak/lib/x86/retail/ceshui.lib E:/WINCE500/public/shell/oak/lib/x86/retail/taskbarlist.lib E:/WINCE500/PBWorkspaces/test1/WINCE500/Emulator_x86/cesysgen/sdk/lib/x86/retail/coredll.lib
SOURCES= /
CDEFINES=$(CDEFINES) -DREAD_FROM_REGISTRY
DEFFILE=E:/WINCE500/public/shell/oak/lib/x86/retail/ceshell.def
这样就可以通过这两个文件生成ceshell.dll;
运行PB5.0中菜单Build OS—〉Open Release Directory,进入DOS状态。进入到
WINCE500/PUBLIC/SHELL/OAK/myshell/ceshell_make目录下,输入:build -c。
这样就生成了ceshell.dll文件。
在myshell文件夹下创建explorer_make文件夹,在explorer_make文件夹下创建makefile和sources文件
makefile文件内容:
!INCLUDE $(_MAKEENVROOT)/makefile.def
sources文件内容:
TARGETNAME=explorer1
TARGETTYPE=PROGRAM
RELEASETYPE=OAK
TARGETLIBS= /
E:/WINCE500/PBWorkspaces/test1/WINCE500/Emulator_x86/cesysgen/sdk/lib/x86/retail/coredll.lib /
E:/WINCE500/public/shell/oak/lib/x86/retail/explorer.lib /
E:/WINCE500/PUBLIC/SHELL/OAK/LIB/x86/RETAIL/explorer.res /
E:/WINCE500/public/shell/oak/lib/x86/retail/explorer_ie.lib /
E:/WINCE500/PBWorkspaces/test1/WINCE500/Emulator_x86/cesysgen/sdk/lib/x86/retail/uuid.lib /
E:/WINCE500/PBWorkspaces/test1/WINCE500/Emulator_x86/cesysgen/sdk/lib/x86/retail/ole32.lib /
E:/WINCE500/PBWorkspaces/test1/WINCE500/Emulator_x86/cesysgen/sdk/lib/x86/retail/oleaut32.lib /
E:/WINCE500/PBWorkspaces/test1/WINCE500/Emulator_x86/cesysgen/sdk/lib/x86/retail/commctrl.lib /
E:/WINCE500/PBWorkspaces/test1/WINCE500/Emulator_x86/cesysgen/sdk/lib/x86/retail/ceshell.lib /
E:/WINCE500/PBWorkspaces/test1/WINCE500/Emulator_x86/cesysgen/oak/lib/x86/retail/shcore.lib /
E:/WINCE500/public/shell/oak/lib/x86/retail/aygutils.lib /
E:/WINCE500/public/shell/oak/lib/x86/retail/favorites.lib /
E:/WINCE500/public/shell/oak/lib/x86/retail/taskbar.lib /
E:/WINCE500/PBWorkspaces/test1/WINCE500/Emulator_x86/cesysgen/oak/lib/x86/retail/ieceext.lib /
E:/WINCE500/public/shell/oak/lib/x86/retail/shellaygfuncs.lib /
E:/WINCE500/public/shell/oak/lib/x86/retail/shellpslayg.lib /
SOURCELIBS= /
SOURCES= /
这样就能通过这两个文件,单独生成explorer1.exe文件
运行PB5.0中菜单Build OS—〉Open Release Directory,进入DOS状态。进入到
WINCE500/PUBLIC/SHELL/OAK/myshell/explorer_make目录下,输入:build -c。
这样就生成了explorer1.exe文件。
[HKEY_LOCAL_MACHINE/init]
"Launch50"="explorer.exe"
"Depend50"=hex:14,00, 1e,00
改为
[HKEY_LOCAL_MACHINE/init]
"Launch50"="explorer1.exe"
"Depend50"=hex:14,00, 1e,00
这样就可以修改shell中的代码了!
; @CESYSGEN IF SHELL_MODULES_EXPLORER
explorer1.exe $(_FLATRELEASEDIR)/explorer1.exe NK S
E:/WINCE500/PBWorkspaces/test1/RelDir/Emulator_x86_Debug目录下并覆盖原来的文件。
这样再makeimg就可以将你修改后的代码装载到你的模拟器中了!
自己总结的,希望能对大家有用!
Windows ce 桌面定制小结——转载
一、采用standard shell,
去掉任务栏 代码%_winceroot%/public/shell/oak/hpc
我尝试了以下两种方法:
1、在taskbar.cpp中将函数BOOL CTaskBar::Register()的内容全部删除,直接return TRUE;
2、在explorer.cpp中将函数DWORD WINAPI CreatTaskBar()的内容删除,直接return 0;
两种方法都可以实现,只是不太清楚哪个方法更节约时间和空间。个人感觉第2个方法比较好。
去除桌面“我的电脑”“回收站”的图标
代码%_winceroot%/public/shell/oak/files
在shell.reg文件中找到这两个键值,它们对应着桌面上的我的电脑和回收站,删除这两个键值:
[HKEY_LOCAL_MACHINE/Explorer/Desktop]
"{000214A0-0000-0000-C000-000000000046}"="My Computer"
"{000214A1-0000-0000-C000-000000000046}"="Recycle Bin"
注:也可只修改项目release目录下的shell.reg.之后只要make image就可以了。
二、采用taskman shell,需设置环境变量__SYSGEN_TASKMAN=1.。
taskman shell没有任务栏、开始菜单和桌面图标,但有桌面背景色。
代码%_winceroot%/public/wceshellfe/oak/taskman/
修改桌面背景色
mindeskt.cpp中的void Desktop_OnPaintBkgnd()函数,更改其中的brush的颜色即可。
即将HBRUSH hBkBrush = CreateSolidBrush(GetSysColor(COLOR_BACKGROUND));
改成HBRUSH hBkBrush = CreateSolidBrush(RGB(123,230,123));即可实现背景色的改变。
----------------------------------
修改wince桌面背景图片及桌面上的图标:
方法一:
将图片文件拷贝到生成平台目录,如:拷贝 Wallpaper_800×600.bmp 到D:/WINCE500/PBWorkspaces/SHELL_demo/RelDir/Emulator_x86_Release 下
Platform Builder 5.0 下点击菜单 “Build OS” -> “Open Release Directory”
在弹出的 console 中 输入: notepad shell.bib,也就是用记事本打开
D:/WINCE500/PBWorkspaces/SHELL_demo/RelDir/Emulator_x86_Release 下的
shell.bib 文件,进行编辑
编辑下面的代码,把 windowsce_qvgap.bmp 修改成自己添加的图片文件。即把
; @CESYSGEN IF SHELL_MODULES_QVGAP
windowsce.bmp $(_FLATRELEASEDIR)/windowsce_qvgap.bmp NK S
; @CESYSGEN ENDIF SHELL_MODULES_QVGAP
改为:
; @CESYSGEN IF SHELL_MODULES_QVGAP
windowsce.bmp $(_FLATRELEASEDIR)/Wallpaper_800x600.bmp NK S
; @CESYSGEN ENDIF SHELL_MODULES_QVGAP
保存 shell.bib 文件,回到 pb5,点击菜单
“Build OS” -> “Make Run-Time Image”,即重新生成镜像文件,然后下载到模拟器或设 备,就会发现壁纸已经换了 。
方法二:
1.应该修改你的release目录下的wceshellfe.reg文件
2.将图片拷贝到你的release目录下
3.修改release目录下的platform.bib文件,把图片文件加入内核(增加这么一句:
window.bmp $(_FLATRELEASEDIR)/window.bmp NK U
4.make image 。
方法三:
还有一种可行办法的:
条件是系统支持注册表保存。
设定好背景,挂起系统,以后每次启动都是设置好的背景了。
WinCE桌面墙纸及图标更换
http://blog.csdn.net/nanjianhui/archive/2009/06/19/4282613.aspx
网上关于WinCE更换墙纸的文章一大堆,我也来写一篇,和网上已有的文章没什么区别。以前写的WinCE Blog大部分都是BSP相关的,以后打算写点WinCE系统定制方面的,就从这里开始吧。
关于WinCE的墙纸,是在注册表中设置的,编译完WinCE工程以后,所有的reg文件中的内容都会被合并为reginit.ini文件。打开这个文件,可以找到如下内容:
[HKEY_CURRENT_USER/ControlPanel/Desktop]
"wallpaper"=//Windows//WindowsCE.bmp
默认情况下,显示的是WindowsCE.bmp文件,但是被编译工程的release目录下并没有WindowsCE.bmp文件,倒是可以看到windowsce_qvgap.bmp和windowsce_vgal.bmp两个文件。这里需要看一下/WINCE600/public/shell/files/shell.bib文件中的定义就明白了。
说白了,更换墙纸就是改注册表设置。最简单的方法就是修改project.bib和project.reg文件。首先在project.bib文件中添加如下内容:
kungfuPanda.bmp d:/WINCE600/OSDesigns/Emulator/Emulator/RelDir/DeviceEmulator_ARMV4I_Release/wall.bmp NK S
然后在project.reg文件添加如下内容:
[HKEY_CURRENT_USER/ControlPanel/Desktop]
"wallpaper"="//Windows//kungfuPanda.bmp"
最后将这两个文件拷贝到工程编译的release目录下面,重新Makeimg就可以了。在WinCE启动以后,我们会看到墙纸已经被更换,同样还能看到桌面上的”My Device”和”Recycle Bin”,现在我想把他们的图标和名字也更换了,当然还要从注册表入手。相关注册表配置如下:
; Drives (My Device)
[HKEY_CLASSES_ROOT/CLSID/{000214A0-0000-0000-C000-000000000046}]
"DisplayName"=mui_sz:"ceshell.dll,#20482"
"DefaultIcon"="//Windows//ceshell.dll,-4354"
[HKEY_CLASSES_ROOT/CLSID/{000214A0-0000-0000-C000-000000000046}/InprocServer32]
@="//Windows//ceshell.dll"
; Recycle Bin (BitBucket)
[HKEY_CLASSES_ROOT/CLSID/{000214A1-0000-0000-C000-000000000046}]
"DisplayName"=mui_sz:"ceshell.dll,#20481"
"DefaultIcon"="//Windows//ceshell.dll,-4352"
"AltIcon"="//Windows//ceshell.dll,-4355"
[HKEY_CLASSES_ROOT/CLSID/{000214A1-0000-0000-C000-000000000046}/InprocServer32]
@="//Windows//ceshell.dll"
简单解释一下:
“DisplayName”:显示的名字,名字来源于ceshell.dll中的资源,其中My Device的资源ID为20482,Recycle Bin的资源ID为20481。
“DefaultIcon”:显示的图标,图标来源于ceshell.dll中的资源,其中My Device的图标资源ID为4354,Recycle Bin的图标资源ID为4352。
“AltIcon”:是指Recycle Bin中有东西时候的图标,大家都知道Recycle Bin空的时候和有东西的时候,图标显示是不一样的,这个图标资源来源于ceshell.dll中的图标资源,ID为4355。
实际上,他们都来源于ceshell.dll中的资源文件,这个我们需要看一下/WINCE600/public/shell/oak/hpc/ceshell/ui目录下的resource.h和ceshui_base.rc两个文件,在resource.h中找到如下定义:
#define IDS_DISPLAY_RECYCLEBIN 0x5001 //20481
#define IDS_DISPLAY_DRIVES 0x5002 //20482
#define IDI_BITBUCKET 0x1100 //4352
#define IDI_BITBUCKET_FULL 0x1103 //4355
#define IDI_MYCOMPUTER 0x1102 //4354
这些就是ID资源的定义,根据这些可以在cehui_base.rc中找到相应的资源,如下:
IDS_DISPLAY_RECYCLEBIN "Recycle Bin"
IDS_DISPLAY_DRIVES "My Device"
IDI_BITBUCKET ICON DISCARDABLE "RES//bitbucket.ico"
IDI_BITBUCKET_FULL ICON DISCARDABLE "RES//bitbucket_full.ico"
IDI_MYCOMPUTER ICON DISCARDABLE "RES//mycomputer.ico"
如果想更换图标或者改名字,修改cehui_base.rc就可以了。首先把自己的图标拷贝到/WINCE600/public/shell/oak/hpc/ceshell/ui/res目录下面,然后在resource.h中定义几个新的ID,在cehui_base.rc中将新定义的ID和相应的图标或者名字相关联。
接下来打开工程的project.reg文件,添加下面的内容:
; Drives (My Device)
[HKEY_CLASSES_ROOT/CLSID/{000214A0-0000-0000-C000-000000000046}]
"DisplayName"=mui_sz:"ceshell.dll,#20736"
"DefaultIcon"="//Windows//ceshell.dll,-4624"
[HKEY_CLASSES_ROOT/CLSID/{000214A0-0000-0000-C000-000000000046}/InprocServer32]
@="//Windows//ceshell.dll"
; Recycle Bin (BitBucket)
[HKEY_CLASSES_ROOT/CLSID/{000214A1-0000-0000-C000-000000000046}]
"DisplayName"=mui_sz:"ceshell.dll,#20737"
"DefaultIcon"="//Windows//ceshell.dll,-4625"
"AltIcon"="//Windows//ceshell.dll,-4355"
[HKEY_CLASSES_ROOT/CLSID/{000214A1-0000-0000-C000-000000000046}/InprocServer32]
@="//Windows//ceshell.dll"
这些配置是为了修改显示名字和图标,主要是修改ceshell.dll中的资源ID。
最后打开工程的命令行窗口,切换到/WINCE600/public/shell/oak/hpc/ceshell目录,运行build进行编译,然后重新编译WinCE工程。
最后编译完成以后,运行WinCE就可以看到墙纸以及My Device和Recycle Bin的名字和图标都被更换了。如图:
我把原来的My Device更换为Root,把Recycle Bin更换为Box,把墙纸更换为功夫熊猫的墙纸了。看上去还不错啊。
WINCE 建立快捷方式、内核添加文件(转)
1.WINCE快捷方式结构
WINCE的快捷方式和WIN2K,XP的不同,只是一个后缀名为.LNK的文本文件.
其格式如下: 数字#路径
比如,有个快捷方式写法如下:23#/Windows/ToolViewer.exe
指的是指向WINDOWS文件夹下的Toolviewer.exe可执行文件.数字究竟代表的是什么意思,我也不太清楚;有一说法是#后的ACSII字符 的数量,但如果把上述例子改为1#/Windows/ToolViewer.exe也可正常运行,但去掉数字则系统无法识别.虽然可以正常使用,但建议还 是按照文档#之后的ACSII字符数量填写.
2.如何把快捷方式加到内核中
假设我们有一快捷方式EnglishExp.lnk,要将其加到内核中.
在PB环境中打开工程,在project.bib文件的FILES字段中添加:
EnglishExp.lnk $(_WINCEROOT)/PLATFORM/MyAPPC/EnglishExp.lnk NK H
其中 $(_WINCEROOT)指的是PC机子上PB安装的根目录,H指的是文件属性,意义代表如下:
S:系统
H:隐藏
R:压缩的资源文件
C:压缩文件
U:非压缩文件
3.如何把快捷方式放到桌面
语法如下:Directory("欲拷贝至的文件夹"):-File("更改的名称","要拷贝的文件")
假设我们有一快捷方式EnglishExp.lnk,要将其放到桌面,并把快捷方式的名称改为"英语"
在PB的project.dat文件加入此句:
Directory("/Windows/LOC_DESKTOP_DIR"):-File("英语.lnk","/Windows/CEnglishExp.lnk")
包含在内核里面的文件全部释放到"/Windows"文件夹下.
LOC_DESKTOP_DIR指的是本地桌面.在PB中,常用的还有如下宏定义:
LOC_DESKTOP_DIR: 桌面
LOC_MYDOCUMENTS_DIR: My Documents
LOC_PROGRAMFILES_DIR: Program Files
LOC_FAVORITES_DIR: Favorites
LOC_RECENT_DIR: Recent
LOC_MYDOCUMENTS_DIR: My Documents
LOC_HELP_DIR: Help
更多的定义可以在ceshellfe.str文件中找到
4.消除快捷方式的小箭头
在PC机的操作系统中可以通过修改注册表来取消快捷方式左下角的小箭头,但在WINCE中注册表没有关于取消小箭头的键值(可能我没找到^_^).在这里我采用的是直接修改资源文件的做法.
打开shcore.res文件,其中文的路径在 $(_WINCEROOT)/PUBLIC/COMMON/OAK/LIB/ARMV4I/RETAIL/0804/,然后将1205的ICO的小箭头删 掉即可.注意,不是删除ID为1205的ICO图标,是删除ICO图标中的内容.
5.微软应用程序的快捷方式
如果在PB中添加了微软的应用软件,便会在桌面和程序中添加其快捷方式;如果觉得快捷方式碍眼,可以将其注释掉再编译即可.
现在列出一些dat文件中定义的微软应用软件的快捷方式:
wceappsfe.dat (C:/WINCE420/PUBLIC/WCEAPPSFE/OAK/FILES/),内含:pmail,wordpad
wceshellfe.dat (C:/WINCE420/PUBLIC/WCESHELLFE/OAK/FILES/),内含:iexplore,帮助文档在"help"文件夹的快捷方式
viewers.dat (C:/WINCE420/PUBLIC/VIEWERS/OAK/FILES/), 内含:pdfviewer,imageviewer,Presviewer,Docviewer
directx.dat (C:/WINCE420/PUBLIC/DIRECTX/OAK/FILES/),内含:Media Player,DVD Player
6. 修改默认shell
其实让一个程序在wince里启动和windows里差不多,直接设置其为启动项,这个有几个方法。一个就是制作一个快捷方式,指向我们的应用程序如app.exe,然后将快捷方式放到/windows/startup下面。
步骤如下:(假设app.exe已经拷贝到windows下面)
在pb中创建一个文件,文件类型选txt,然后命名为.lnk后缀,假设名字为test.lnk
编辑其内容为: 16#/windows/app.exe
备注:前面的16是# 后面所有字符的总和,包括空格。Wince的帮助文档上说这么定义就行,但是我尝试后,最后down到目标机上面时提示找不到文件,在wince里查看这 么创建的test.lnk的属性,发现其指向/windows/app.exe后面还有两个方框,因此不对,我的解决方法是修改test.lnk的内容为 16#"/Windows/app.exe"
编辑好lnk文件内容后在pb中修改project.bib
在files段后面添加下面一行:(和添加别的文件到image中类似,也要在pb的flatform菜单的setting下添加build语句,同上,不再赘述)
test.lnk $(_FLATRELEASEDIR)/test.lnk NK S
project.dat
增加下面一行:
Directory("/Windows/startup"):-File("test.lnk","/Windows/test.lnk")
这样后系统启动后就会自动启动我们的程序了。
另外一种方法是编辑注册表:在project.reg中添加如下内容
[HKEY_LOCAL_MACHINE/init]
"Launch80"="app.exe"
"Depend80"=hex:14,00,1e,00
这个是设定启动顺序,launch后面的数字越大的越是后启动,Depend80后面的指定依赖项,为16进制,上面的语句表明依赖项为launch20 定义的device.exe和launch30中定义的gwes.exe, 注意Launch后面的数字范围为0到99 ,此范围之外的将不会有效果。
这样两种方法的效果都是系统都是系统先启动资源管理器explorer.exe(就是看到的默认桌面),然后启动我们的程序,(如果利用 taskman shell然后去掉任务栏那么效果更好)但是这样还不够,我们如何不显示桌面,直接显示我们的程序呢?
网上有人介绍的方法是去掉standard shell,但是我编译总是报错。我采用的方法是替换注册表中lauch50中的explorer.exe为我的app.exe,即搞定。
修改注册表的方法:先把带KITL的系统跑起来,在PB的TOOLS->Remote registry editor里修改,验证有效后,再去修改platfrom.reg, 或者自己写个REG文件,然后在platform.reg里INCLUDE进来 SYSGEN后确认PBWORKSPACE里相关项目的REL目录里reginit.ini文件里包含了自己做的修改后make image然后DOWNLOAD下去就OK了。
值得补充的是,我们前面介绍的步骤中那个修改平台setting,添加语句的,是因为我每次都是重新sysgen和build,如果只是简单的 make image的话(都是pb中的build OS菜单下的命令),那么将直接用release中的内容,因此也可以直接将文件放到release文件夹,然后改project.bib等实现往 image中添加文件。 同样,也可以直接修改release中的shell.reg中的launch50值为我们自己的程序(或者类似修改reginit.ini文件, reginit.ini文件存放有所有wince的静态注册表,来达到去掉桌面,直接启动我们程序的效果)。
注意,这么启动的程序,如果点击关闭,就会死机的,因为没有窗口运行了。实际运用中,当然不会让用户关闭我们的程序,除非他一起关闭系统。
如果也需要build的话,可以通过往image中添加文件的方法将我们改好的shell.reg添加到release目录。
总之,今天是把定制shell算是基本完成了。
wince 在桌面创建快捷方式
1.WINCE快捷方式结构
WINCE的快捷方式和WIN2K,XP的不同,只是一个后缀名为.LNK的文本文件.
其格式如下:
数字#路径
比如,有个快捷方式写法如下:
23#/Windows/ToolViewer.exe
指的是指向WINDOWS文件夹下的Toolviewer.exe可执行文件.数字究竟代表的是什么意思,我也不太清楚;有一说法是#后的ACSII字符 的数量,但如果把上述例子改为1#/Windows/ToolViewer.exe也可正常运行,但去掉数字则系统无法识别.虽然可以正常使用,但建议还 是按照文档#之后的ACSII字符数量填写.
这个就是路径的问题所在,lnk文件的内容应为23#"/Windows/ToolViewer.exe" .#号前面的数字可以任意。只是#前面的数字不符时查看快捷方式的属性会发现路径后面多了几个口口。不过这并不影响。
2.如何把快捷方式加到内核中
假设我们有一快捷方式EnglishExp.lnk,要将其加到内核中.
在PB环境中打开工程,在project.bib文件的FILES字段中添加:
EnglishExp.lnk $(_WINCEROOT)/PLATFORM/MyAPPC/EnglishExp.lnk NK H
其中 $(_WINCEROOT)指的是PC机子上PB安装的根目录,H指的是文件属性,意义代表如下:
S:系统
H:隐藏
R:压缩的资源文件
C:压缩文件
U:非压缩文件
3.如何把快捷方式放到桌面
语法如下:Directory(”欲拷贝至的文件夹”):-File(”更改的名称”,”要拷贝的文件”)
假设我们有一快捷方式EnglishExp.lnk,要将其放到桌面,并把快捷方式的名称改为”英语”
在PB的project.dat文件加入此句:
Directory(”/Windows/LOC_DESKTOP_DIR”):-File(”英语.lnk”,”/Windows/CEnglishExp.lnk”)
包含在内核里面的文件全部释放到”/Windows”文件夹下.
LOC_DESKTOP_DIR指的是本地桌面.在PB中,常用的还有如下宏定义:
LOC_DESKTOP_DIR: 桌面
LOC_MYDOCUMENTS_DIR: My Documents
LOC_PROGRAMFILES_DIR: Program Files
LOC_FAVORITES_DIR: Favorites
LOC_RECENT_DIR: Recent
LOC_MYDOCUMENTS_DIR: My Documents
LOC_HELP_DIR: Help
小结:创建快捷方式本来是很简单的,不过有些细节的东西没搞明白真的会让你进了死胡同。希望我的这篇文章能对大家有用。
http://blog.csdn.net/wen_hua/archive/2009/11/20/4842465.aspx
winCE系统启动时自动运行应用程序或放在桌面--已验证
一、快捷方式
假定Windows CE.NET目标工程为CEPC类型,目录为E:/Project/MyWinCE,
并且工程已经Build(或者Rebuild)成功;
假定WindowsCE.NET的应用为"MyApp.exe"
1.将MyApp.exe复制到E:/PROJECTS/MyWinCE/RelDir/SAMSUNG_SMDK2440_ARMV4IRelease目录下;
2.修改MyWinCE工程的project.bib文件,在FILES添加
MyApp.exe $(_FLATRELEASEDIR)/MyApp.exe NK H
3.创建快捷方式文件MyApp.lnk(先建文本文件,写入内容后再改扩展名为.lnk),文件内容如下(就一行字符):
10#/Windows/MyApp.exe
MyApp.lnk文件也放入E:/PROJECTS/MyWinCE/RelDir/SAMSUNG_SMDK2440_ARMV4IRelease目录下
4.修改MyWinCE工程的project.bib文件,在FILES添加
MyApp.lnk $(_FLATRELEASEDIR)/MyApp.lnk NK H
5.修改MyWinCE工程的project.dat文件,添加如下内容:
Directory("/Windows/Startup"):-File("MyApp.lnk","/Windows/MyApp.lnk")
6.Platform Builder IDE->菜单Build->MakeImage(记得千万不要Build或者Rebuild,
否则你就要重新来一遍)
到此得到的NK.bin就包含了应用程序MyApp.exe和MyApp.lnk,
并且MyApp程序会在系统启动时自动运行。
已通过运行!!!!!!!!!!一一2007.9.17晚
WinCE桌面添加应用程序的快捷方式
http://hi.baidu.com/wu_yuzhi/blog/item/362989512cef22551138c21a.html
将可执行程序MyApp.exe放入FAT分区KinglyFlash中,在桌面创建其快捷方式:
(1) 创建KinglyApp.lnk 快捷方式文件
使用桌面Windows 自带的记事本创建,保存时将后缀名改为lnk即可。.lnk 文件其实是一个文本文件,它包含用于链接目标的命令行以及命令行的长度,用于指向该快捷方式对应的应用程序存放的路径(建立起应用程序与其快捷方式之间的对应关系),其格式为 “<length>#<command line>”,其中length 是#后所有字符的个数,因此,KinglyApp.lnk的内容如下:
22#/KinglyFlash/MyApp.exe
注意:当把KinglyApp.lnk 后缀改为.lnk 后,使用记事本一般就无法打开了。
把这个文件放入smdk2410/FILES 目录中。
(2) 把快捷方式添加到内核中
打开project.bib 文件,添加如下内容:
KinglyJetApp.lnk $(_FLATRELEASEDIR)/KinglyApp.lnk NK U
这样,执行SYSGEN 的时候会把KinglyJetApp.lnk加入到内核中,最后会存在于开发板的/Windows 目录中。
注意:KinglyJetApp.lnk是生成的/Windows 目录下的快捷方式名,而KinglyApp.lnk则是第一步中建立的lnk文件名,否则会编译错误,当然,两个文件名也可以是一样的。
(3) 把快捷方式添加到桌面
打开project.dat,加入以下内容:
Directory("/Windows/LOC_DESKTOP_DIR"):-File("Kingly测试.lnk","/Windows/KinglyJetApp.lnk")
这将会在桌面出现名称为“Kingly测试”的快捷方式,它是KinglyJetApp.lnk的一个
拷贝,其内容和KinglyJetApp.lnk是一样的。
(4) 最后执行菜单Builder -Sysgen,生成NK.bin 和NK.nb0
把它们烧写或者下载到开发板启动后,就会在桌面看到“Kingly测试”快捷方式了。