wince注册表结构.doc

上传人:laozhun 文档编号:2392489 上传时间:2023-02-17 格式:DOC 页数:41 大小:606.50KB
返回 下载 相关 举报
wince注册表结构.doc_第1页
第1页 / 共41页
wince注册表结构.doc_第2页
第2页 / 共41页
wince注册表结构.doc_第3页
第3页 / 共41页
wince注册表结构.doc_第4页
第4页 / 共41页
wince注册表结构.doc_第5页
第5页 / 共41页
点击查看更多>>
资源描述

《wince注册表结构.doc》由会员分享,可在线阅读,更多相关《wince注册表结构.doc(41页珍藏版)》请在三一办公上搜索。

1、wince注册表结构与桌面Windows一样,Windows CE也使用注册表(Registry)来保存应用程序、驱动程序和用户的设定以及其他一些配置信息。Windows CE注册表也采用树形结构来管理配置信息,由于Windows CE注册表的结构和功能与桌面Windows几乎一样,在这里就不详细介绍了,读者可以参考其它关于注册表的资料。Windows CE支持四个根键,描述如下:键名 描述HKEY_LOCAL_MACHINE 硬件和驱动配置数据HKEY_CURRENT_USER 用户配置数据HKEY_CLASSES_ROOT OLE和文件类型匹配配置数据HKEY_USERS 适用于所有用户的

2、数据由于嵌入式系统的特点,一些嵌入式设备是没有外存的。因此Windows CE的注册表提供了两种实现方式:基于RAM的注册表(RAM-Based Registry)和基于Hive的注册表(Hive-Based Registry)。我们可以选择在Windows CE中使用任何一种注册表,注册表类型对于用户和应用程序来说是透明的。 基于RAM的注册表正如其名,基于RAM的注册表把整个注册表作为一个对象存储堆存放在系统的内存中。这意味着如果对系统进行冷启动或者系统断电,对注册表的所有改动都会丢失。如果使用基于RAM的注册表,对注册表的读写访问操作会变得非常高效。因此基于RAM的注册表

3、比较适用于没有外部存储,而且有电池保存内存数据(battery-backed RAM)的设备。如果有外存且经常冷启动的设备采用基于RAM的注册表,则需要在系统断电的时候对注册表进行保存,等系统再次启动时对保存的注册表进行还原。Windows CE提供了两种方法用来断电保存基于RAM的注册表:1. Windows CE提供了两个系统API用来保存和还原整个注册表,它们的原形如下:BOOL RegCopyFile( LPCWSTR lpszFile / 保存注册表信息的文件的名字);BOOL RegRestoreFile( LPCWSTR lpszFile / 保存注册表信息的文件的名字);如果要

4、保存和恢复注册表,我们只需要在系统断电的时候调用RegCopyFile函数将整个注册表保存为外存上的一个文件。当系统重新启动时,我们再调用RegRestoreFile函数将文件全部读出RAM中,然后再热启动系统,我们保存得注册表就可以生效了。值得注意的是这次热启动是必须的,因为只有在系统启动的时候才会去检测RegRestoreFile放在RAM里的注册表信息。这种方法的优点是完全可以使用应用程序来实现基于RAM的注册表的保存,而且这种方法相对简单。但是此方法的缺点是需要两次启动。因此效率相对比较低。2. 第二种方法需要OEM的参与,OEM可以在BSP的OAL层中实现WriteRegistryT

5、oOEM和ReadRegistryFromOEM两个函数,它们的声明为:DWORD ReadRegistryFromOEM( DWORD dwFlags, / 参数, REG_READ_BYTES_START表示读新的注册表 LPBYTE lpData, / 指向注册表数据的缓冲区,由OS分配 DWORD cbData / 缓冲区的大小);BOOL WriteRegistryToOEM( DWORD dwFlags, / 参数,REG_WRITE_BYTES_START表示写新的注册表 LPBYTE lpData, / 指向注册表数据的缓冲区,由OS分配 DWORD cbData / 缓冲区的

6、大小,0表示到达注册表尾部);Windows CE会在系统启动和关闭的时候调用这两个函数来保存和恢复注册表。此种方法虽然可以避免两次启动,但是困难的地方是ReadRegistryFromOEM函数的实现比较困难,因为在系统启动的时候,块设备驱动和文件系统的驱动都还没有加载,因此不能使用CreateFile,ReadFile这样的文件系统API来实现ReadRegistryFromOEM函数,只能使用一些更底层的操作来实现。 基于Hive的注册表自从Windows CE 4.0之后,Windows CE提供了基于Hive的注册表。基于Hive的注册表把注册表数据存放在文件系统的文

7、件上,这种文件被称作蜂箱Hive。这就意味着不再需要在系统断电和启动时进行保存恢复注册表操作。Hive是注册表中的一组键,子键和值。Hive是文件系统上表现为单个文件。Windows CE中有三种Hive。类型 文件 描述Boot hive ROM中的Boot.hv HKEY_LOCAL_MACHINE, HKEY_CLASSES_ROOT, HKEY_USERS中的所有数据。只在启动时使用。System hive 由OEM决定(通常是System.hv) HKEY_LOCAL_MACHINE, HKEY_CLASSES_ROOT, HKEY_USERS中的所有数据。包含设备范围内不随着用户改

8、变而改变的数据。User hive User.hv HKEY_CURRENT_USER下的所有数据。 包含用户特有的设置,每个用户都有一个单独的User.hv。基于Hive的注册表适用于对于有永久存储并且需要经常冷启动的设备。我们也可以看到,基于Hive的注册表把系统数据和用户数据分开存放,这就意味着基于Hive的注册表还提供多用户支持。对于每一个用户,可以提供不同的User.hv,当用户登录时加载相应的User.hv,从而达到多用户目的。注册表类型分为基于对象存储的注册表和基于HIVE的注册表,在制定内核的时候只能选择其中一种。从理论上讲这两种注册表都能够实现永久保存注册表数据,不过采用不同

9、的类型会影响CE的启动顺序和启动速度,还会影响内存的使用量。我还是趋向于采用基于HIVE的注册表来实现永久保存注册表数据,这也是个发展趋势。在讲解之前先简单描述如果CE采用基于HIVE的注册表,那么在启动时怎么加载已保存的注册表数据:1、nk.exe执行,启动filesys.exe。2、filesys.exe加载引导HIVE,此时引导HIVE位于nk.bin解压之后的文件中。3、filesys.exe启动device.exe,之后处于等待状态,等待device.exe将包含系统HIVE的文件系统和存储设备的驱动程式加载完毕。而这个文件系统和存储设备的驱动程式存在于引导HIVE中。4、devic

10、e.exe加载上述所说的文件系统驱动程式和存储设备驱动程式,使之开始工作。之后device.exe处于等待状态。5、filesys.exe被唤醒,加载并且安装系统HIVE。之后filesys.exe处于等待状态。6、nk.exe按照系统HIVE的信息开始执行初始化工作。其中包括加载驱动程式和启动一些应用程式。其中加载驱动程式一般由device.exe执行,而启动应用程式由filesys.exe执行。这时device.exe和filesys.exe已被唤醒。因为引导HIVE和系统HIVE肯定有重复的地方,所以可能出现重复加载了驱动程式或重复启动了应用程式。为此,CE允许在描述驱动程式的注册表信息

11、中加入防止重复的标志,而应用程式能采用事件对象来防止重复启动,如device.exe。下面讲述怎么设置基于HIVE的注册表(如果保存系统HIVE的是FAT文件系统):1、在PB中加入Hive-based Registry,如果是Geode平台,再加入BSP_ENABLE_FSREGHIVE环境变量。2、打开platform.reg,找到如下信息:; HIVE BOOT SECTIONHKEY_LOCAL_MACHINEinitBootVarsSYSTEMHIVE=Documents and Settingssystem.hvPROFILEDIR=Documents and SettingsSt

12、art DevMgr=dword:0IF BSP_ENABLE_FSREGHIVE Start DevMgr=dword:1ENDIF ; END HIVE BOOT SECTIONSYSTEMHIVE的值为系统HIVE文件的路径。Start DevMgr是个布尔值,指示是否开始就执行设备管理器device.exe,按照CE帮助文件的说法,只有想把系统HIVE存储在对象存储中才在此设置为0,所以一般都要设置为1。3、如果是多用户,能在上述的注册表位置下输入DefaultUser=,指定默认的用户名。如果是单用户系统,能不设置。4、确保将包含系统HIVE的文件系统驱动程式的注册表信息和存储设备的

13、驱动程式的注册表信息被包含在“; HIVE BOOT SECTION”和“; END HIVE BOOT SECTION”之间,在这两个语句之间的注册表数据全部属于引导HIVE。如果我们将系统HIVE文件system.hv存放在硬盘上,并采用FAT文件系统。那么就要将HKEY_LOCAL_MACHINESystemStorageManagerFATFS和HKEY_LOCAL_MACHINESystemStorageManagerProfilesHDProfile移动到“; HIVE BOOT SECTION”下。5、在“; HIVE BOOT SECTION”和“; END HIVE BOOT

14、 SECTION”之间的所有驱动程式的注册表信息中都加入下列一个标志: Flags=dword:1000这个标志是个位掩码,他能和其他已存在的Flags或运算。值1000表示此驱动程式只加载一次,这样device.exe就不会把当前驱动程式加载两次了。6、在包含系统HIVE的存储设备的驱动程式的注册表信息中,加入如下标志(假设是硬盘):HKEY_LOCAL_MACHINESystemStorageManagerProfilesHDProfileMountFlags=dword:2这个标志表示这个存储设备包含系统HIVE文件。按照如上所述设置后的内核就能实现永久存储注册表数据了。对于保存注册表数

15、据的执行动作在此必须阐述清晰:正常情况下,CE能够确保重要的注册表数据能够从内存刷到(Flush)永久存储器上。不过这并不能完全确保所有数据都能完整地保存而不丢失,所以要确保万无一失,应该主动地调用RegFlushKey函数强制将内存中的数据刷到永久存储器上。这个函数的参数只有一个,就是注册表分支。CE还增加一个注册表项(如下所示),他的作用是每当函数RegCloseKey被调用时都自动调用RegFlushKey函数。HKEY_LOCAL_MACHINEinitBootVarsRegistryFlags=dword:1如果CE在启动过程中发现系统HIVE出现错误,他会自动删除文件并创建一个默认

16、的系统HIVE文件,如果出现下面的注册表项,说明发生了这种事情。Windows CE下访问物理内存的方法嵌入式设备与桌面PC的一个显著不同是它的应用程序中通常需要直接访问某一段物理内存,这在驱动程序中对物理内存的访问尤为重要,尤其是像ARM体系结构下,I/O端口也被映射成某一个物理内存地址。因此,与桌面版本Windows相比,Windows CE提供了相对简单的物理内存访问方式。无论是驱动程序还是应用程序都可以通过API访问某一段物理内存。Windows CE的有些函数中需要用到物理内存结构体PHYSICAL_ADDRESS, Windows CE在ceddk.h中定义了PHYSICAL_AD

17、DRESS,它其实是LARGE_INTEGER类型,其定义如下:/ in ceddk.htypedef LARGE_INTEGER PHYSICAL_ADDRESS, *PPHYSICAL_ADDRESS;/ in winnt.htypedef union _LARGE_INTEGERstruct DWORD LowPart; LONG HighPart;LONGLONG QuadPart; LARGE_INTEGER;可见,Windows CE中用64个Bit来代表物理地址,对于大多数32位的CPU而言,只需要把它的HighPart设置为0就可以了。如果要直接访问某一个地址的物理内存,Win

18、dows CE提供了VirtualAlloc()和VirtualCopy()函数,VirtualAlloc负责在虚拟内存空间内保留一段虚拟内存,而VirtualCopy负责把一段物理内存和虚拟内存绑定,这样,最终对物理内存的访问还是通过虚拟地址进行。它们的声明如下:/ 申请虚拟内存LPVOID VirtualAlloc(LPVOID lpAddress, / 希望的虚拟内存起始地址DWORD dwSize, / 以字节为单位的大小DWORD flAllocationType, / 申请类型,分为Reserve和CommitDWORD flProtect / 访问权限);/ 把物理内存绑定到虚拟

19、地址空间BOOL VirtualCopy( LPVOID lpvDest, / 虚拟内存的目标地址LPVOID lpvSrc, / 物理内存地址DWORD cbSize, / 要绑定的大小DWORD fdwProtect / 访问权限);VirtualAlloc对虚拟内存的申请分为两步,保留MEM_RESERVE和提交MEM_COMMIT。其中MEM_RESERVE只是在进程的虚拟地址空间内保留一段,并不分配实际的物理内存,因此保留的虚拟内存并不能被应用程序直接使用。MEM_COMMIT阶段才真正的为虚拟内存分配物理内存。下面的代码显示了如何使用VirtualAlloc和VirtualCopy

20、来访问物理内存。因为VirtualCopy负责把一段物理内存和虚拟内存绑定,所以VirtualAlloc的时候只需要对内存保留,没有必要提交。FpDriverGlobals = (PDRIVER_GLOBALS) VirtualAlloc( 0, DRIVER_GLOBALS_PHYSICAL_MEMORY_SIZE, MEM_RESERVE, PAGE_NOACCESS);if (FpDriverGlobals = NULL) ERRORMSG(DRIVER_ERROR_MSG, (TEXT( VirtualAlloc failed!rn); return;else if (!Virtual

21、Copy( (PVOID)FpDriverGlobals, (PVOID)(DRIVER_GLOBALS_PHYSICAL_MEMORY_START), DRIVER_GLOBALS_PHYSICAL_MEMORY_SIZE, (PAGE_READWRITE | PAGE_NOCACHE) ERRORMSG(DRIVER_ERROR_MSG, (TEXT(VirtualCopy failed!rn); return; CEDDK还提供了函数MmMapIoSpace用来把一段物理内存直接映射到虚拟内存。此函数的原形如下:PVOID MmMapIoSpace( PHYSICAL_ADDRESS P

22、hysicalAddress, / 起始物理地址ULONG NumberOfBytes, / 要映射的字节数BOOLEAN CacheEnable / 是否缓存);其实,MmMapIoSpace函数内部也是调用VirtualAlloc和VirtualCopy函数来实现物理地址到虚拟地址的映射的。MmMapIoSpace函数的原代码是公开的,我们可以从%_WINCEROOT%PUBLICCOMMONOAKDRIVERSCEDDKDDK_MAPddk_map.c得到。从MmMapIoSpace的实现我们也可以看出VirtualAlloc和VirtualCopy的用法:PVOID MmMapIoSp

23、ace ( IN PHYSICAL_ADDRESS PhysicalAddress, IN ULONG NumberOfBytes, IN BOOLEAN CacheEnable )PVOID pVirtualAddress; ULONGLONG SourcePhys; ULONG SourceSize; BOOL bSuccess; SourcePhys = PhysicalAddress.QuadPart & (PAGE_SIZE - 1); SourceSize = NumberOfBytes + (PhysicalAddress.LowPart & (PAGE_SIZE - 1); p

24、VirtualAddress = VirtualAlloc(0, SourceSize, MEM_RESERVE, PAGE_NOACCESS); if (pVirtualAddress != NULL) bSuccess = VirtualCopy( pVirtualAddress, (PVOID)(SourcePhys 8), SourceSize, PAGE_PHYSICAL | PAGE_READWRITE | (CacheEnable ? 0 : PAGE_NOCACHE); if (bSuccess) (ULONG)pVirtualAddress += PhysicalAddres

25、s.LowPart & (PAGE_SIZE - 1); else VirtualFree(pVirtualAddress, 0, MEM_RELEASE); pVirtualAddress = NULL; return pVirtualAddress;此外,Windows CE还供了AllocPhysMem函数和FreePhysMem函数,用来申请和释放一段连续的物理内存。函数可以保证申请的物理内存是连续的,如果函数成功,会返回虚拟内存的句柄和物理内存的起始地址。这对于DMA设备尤为有用。在这里就不详细介绍了,读者可以参考Windows CE的联机文档WINCE6.0注册表Windows C

26、E 6.0有4个基本的注册表键值, HKEY_CLASSES_ROOT, HKEY_CURRENT_USER, HKEY_LOCAL_MACHINE, HKEY_USERS。其它的都是这4个注册表的子键。我 们以一个内建的串口驱动为例,它在注册表文件Platform.reg中的描述如下: 其中Prefix 和 Dll项是必不可少的,Prefix代表设备文件名前缀, 与Index合用表示该设备的名称,该注册表子键的设备名称就是COM1:,该名称可以用于CreateFile调用。Dll则是动态链接库名称。 Index为设备序号。Flags为1表示系统启动时不加载,需要应用程序自己加载,为0表示该驱

27、动在系统启动时加载。 HKEY_LOCAL_MACHINEDriversBuiltInSerial Prefix=COM Dll=$(_TGTPLAT_PFX)_serial.dll Flags=dword:0 Index=dword:1在%WinCE Dir%Public%Common%OAK%INC%目录下,文件cregedit.h中,定义了一个类CRegistryEdit来封装了注册表的操作。许多的硬件驱动,比如串口类,也继承了CRegistryEdit类。还有一种方法是利用windows CE提供的API进行注册表项的操作。方法一: 利用系统提供的注册表类CRegistryEdit 类

28、的定义在文件regedit.h中。 在 构建函数中,会取得当前注册表子键的HANDLE句柄。有3个构造函数,第一个是用全路径,调用hKey = OpenDeviceKey(TEXT(HKEY_LOCAL_MACHINEDriversBuiltInSerial)构造, 第二个是如果已知其父注册表子键,调用RegOpenKeyEx( HKEY_LOCAL_MACHINE, TEXT(DriversBuiltInSerial), 0,0,&hKey). 第三种方法是用RegCreateKeyEx(). 析构函数中,调用RegCloseKey(hKey)关闭掉对注册表子键的引用。 读取注册表项可以使用

29、GetRegValue方法,写入注册表项使用RegSetValueEx方法。其方法的实现也是通过windows CE API,具体可以参照下一个Section。 RegGetList和RegSetList方法提供了对类型为REG_MULTI_SZ和DWORD的VALUE的读写操作。 其它类方法GetWindowInfo, GetIsrInfo,GetPciInfo获取注册表更多的信息。方法二: 利用windows CE API 为 了获取一个注册表键值,先要调用RegOpenKeyEx。以上面内建串口驱动为例,RegOpenKey( HKEY_LOCAL_MACHINE, TEXT(Drive

30、rsBuiltInSerial), 0, 0, &hKey ), 其中hKey就是我们获取的该注册表子键的HANDLE句柄。接下来对注册表子键的操作就是通过hKey来实现. 有了hKey, 就可以对注册表子键的各个内容进行读写操作。如果要读去子键的Prefix, 调用函数RegQueryValueEx(hKey, TEXT(Prefix), NULL, &lpType, &lpData, &lpcbData), lpType, lpData为Prefix返回类型和值,该例中,lpType = REG_SZ, lpData = TEXT(COM). lpcbData当调用时,修饰限制lpData

31、的size in bytes,返回时,为lpData返回值的SIZE。 对应于读操作,写操作是一个相反的过程,RegSetValueEx(hKey, TEXT(Prefix), NULL, REG_SZ, PBYTE(TEXT(TST), wcslen(TEXT(TST)*2). 其中要写入的项为Prefix项,类型为REG_SZ, 值为TEXT(TST), 最后一个参数为写入值得SIZE in bytes. 注意第二个参数,如果注册表中存在该项,则改写它的值。如果没有,则新建一个注册表项。 某些情况下,我们需要删除一个注册表项,只需调用RegDeleteKey(hKey, TEXT(Inde

32、x)就可以删除Index注册表项。 要关闭一个注册表子键,只需要调用RegCloseKey(hKey)就可以完成。总结: 关于注册表有很多更加深入的使用,如RegEnumValue. 更多有关注册表项,可以查看MSDN手册。注册表分两种一种叫rom ,一种hive如果注册表是固定的(每一台设备是一样的),可以在platform.reg,project.reg还有common.reg中先设置好,然后再重新build 如果需要保存一些个性化的信息,在H/W reset后还需要恢复这些信息,而且每一台设备中注册表是不一样的,那就用mikemao(mikemao) 所说的方法,不过不是系统启动后再写一

33、遍,而是在启动的过程中就设定注册表。一般的产品很少用这种方法的,因为要保证H/W Reset后回到出厂状态,不过我们公司的产品中就用了第二种方法,这种方法实现要复杂一点,有兴趣的话再探讨。问题解决:1 要把platform中得注册表设置为hive 2 再代码中保存的时候使用fulshkey()WinCE注册表简介在WinCE中支持两种类型的注册表:RAM-Based和HIVE-Based,默认情况下使用的是RAM-Based注册表。 1.RAM-Based注册表 RAM-Based的注册表是将所有的注册表数据存储在对象存储(object store)中,也就是存放在RAM里面。一般用在有电池备

34、份RAM的系统上面,也就是说,当系统掉电以后,会自动切换成电池供电,此时RAM还有供电,所以上面的数据不会丢失,这样采用RAM-Based注册表非常有效。RAM-Based注册表多用于经常热启动(Warm Boot)的设备上面,很少用在冷启动(Cold Boot)设备上面。2.HIVE-Based注册表 HIVE-Based的注册表是将注册表数据存成文件,也就是存在掉电不会丢失数据的磁盘上面,HIVE注册表被分成两部分:系统Hive和用户Hive,也就是system.hv和user.hv。在一个多用户系统中,会包含多个用户Hive,不同的用户Hive(user.hv)会在该用户登陆的时候被加载

35、,被注销的时候卸载。实际上HIVE-Based的注册表包含三个部分,我称之为引导Hive,系统Hive和用户Hive,也就是Boot.hv,system.hv和user.hv。Boot.hv主要用于系统引导时候所需的注册表设置,这部分设置不会被保存在磁盘上面,也就是说,在系统掉电以后就会丢失。实际上,这部分应该说是属于RAM-Based注册表,由于这部分数据不需要改动,所以也就无所谓了。System.hv存放关于系统的注册表设置,user.hv存放和用户相关的注册表设置。一般在我们编译WinCE系统的时候,Platform Builder会根据platform.reg文件中的注释标签来判断哪些

36、注册表设置放入boot.hv中,凡是在注释标签”;HIVE BOOT SECTON”和”;END HIVE BOOT SECTION”之间的设置都会被放入boot.hv中,其他的都会放到default.hv和user.hv中。在WinCE第一次引导的时候,所有的.hv都会被放到RAM中,WinCE系统会首先读取boot.hv进行相关引导时候的设置,然后把default.hv和user.hv放到磁盘的指定路径下面,这个路径也是在注册表中设置的,然后default.hv会被重命名为system.hv。当系统第二次启动的时候,会比较磁盘上的.hv和内存中的.hv是否一致,如果不一致,会拷贝磁盘上面的

37、.hv到内存中。我们可以看出,实际上HIVE注册表在运行的时候也是放在RAM中的,这样速度比较快。启动的时候会从磁盘上读出,在用户更改注册表以后,会被保存在磁盘上,保存的时机也是可以设置的,可以选择在用户更改后立刻保存到磁盘上,也可以选择在reboot的时候保存。WINCE注册表应用/AUTHOR:/norains/DATE:/Tuesday 25-April -2006/=1.让桌面不显示我的电脑,回收站删除以下键值:HKEY_LOCAL_MACHINEExplorerDesktop000214A0-0000-0000-C000-000000000046 ;My Computer000214

38、A1-0000-0000-C000-000000000046 ;Recycle Bin存在这两个键值的文件有:$(_WINCEROOT)PUBLICSHELLOAKFILESshell.reg$(_WINCEROOT)PUBLICWCESHELLFEOAKFILESwceshellfe.reg$(_WINCEROOT)PUBLICWCESHELLFEOAKFILESwceshellfe88.reg2.直接删除文件,不放回回收站HKEY_LOCAL_MACHINEExplorerUseRecycleBin=dword:0 ;设置0为直接删除;设置1为放入回收站3.修改XP皮肤的系统界面颜色如果选

39、择了XP SKIN,则在控制面板的显示选项中是无法更改一些窗口的颜色的.不过,我们倒是可以通过更改$(_WINCEROOT)PUBLICCOMMONOAKFILEScommon.reg文件中的XP颜色参数来达到更改窗口颜色的目的.原XP样式的颜色参数如下:HKEY_LOCAL_MACHINESYSTEMGWE SysColor=hex: 00,00,00,00, 3A,6E,A5,00, 00,00,00,00, 00,00,00,00, EF,EB,DE,00, FF,FF,FF,00, 00,00,00,00, 00,00,00,00, 00,00,00,00, FF,FF,FF,00,

40、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代表的意思是:0 COLOR_SCROLLBAR Color of the gray area of a scroll bar.1 COLOR_BACKGROUN

41、D Background color of the desktop window.2 COLOR_ACTIVECAPTION Color of the title bar of an active window.3 COLOR_INACTIVECAPTION Color of the title bar of an inactive window.4 COLOR_MENU Background color of a menu.5 COLOR_WINDOW Background color of a window.6 COLOR_WINDOWFRAME Color of a window fra

42、me.7 COLOR_MENUTEXT Color of the text in a menu.8 COLOR_WINDOWTEXT Color of the text in a window.9 COLOR_CAPTIONTEXT Color of the text in a title bar and of the size box and scroll bar arrow box.10 COLOR_ACTIVEBORDER Color of the border of an active window.11 COLOR_INACTIVEBORDER Color of the border

43、 of an inactive window.12 COLOR_APPWORKSPACE Background color of multiple document interface (MDI) applications.13 COLOR_HIGHLIGHT Color of an item selected in a control.14 COLOR_HIGHLIGHTTEXT Color of the text of an item selected in a control.15 COLOR_BTNFACE Color of the face of a button.16 COLOR_

44、BTNSHADOW Shadow color of buttons for edges that face away from the light source.17 COLOR_GRAYTEXT Color of shaded text. This color is set to 0 if the current display driver does not support a solid gray color.18 COLOR_BTNTEXT Color of the text for push buttons.19 COLOR_INACTIVECAPTIONTEXT Color of the text in the title bar of an inactive window.20 COLOR_BTNHIGHLIGHT Highlight color of buttons

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 建筑/施工/环境 > 项目建议


备案号:宁ICP备20000045号-2

经营许可证:宁B2-20210002

宁公网安备 64010402000987号