wince 6wince 应用程序序 怎样 kerneliocontrol

天极传媒:天极网全国分站
您现在的位置: &&
WinCE中OEM适配层编程点滴之创建OAL
天极网 00:04
  付林林:
  2001年计算机专业毕业。从毕业起一直从事软件开发工作。目前从事 Windows CE 下内核定制和程序开发。在实际工作中积累了CE下开发的一些经验。希望和 CE 下开发者交流、探讨,更希望你们能不吝赐教。我的EMail:   如果您有技术问题向我咨询,请登录,本人将在此论坛回复您的问题。在论坛上交流会更方便些,其它网友也可以回答参与,弥补了我的不足。
     正文  正如CE的帮助文档所言,创建OAL是一个非常复杂的任务,而通常的办法是复制原有的相同平台的OAL代码,然后修改来适应平台的特殊要求。也就是说对于没有特殊要求的平台,复制原有相同平台的OAL代码就足够了。由于OAL的复杂性在这篇文章中我只讲解常用的部分。   一、实现ISR  1. ISR的概念  ISR(interrupt service routine)是处理IRQs(interrupt request line)的程序。Windows CE用一个ISR来处理所有的IRQ请求。当一个中断发生时,内核的异常处理程序先调用内核ISR,内核ISR禁用所有具有相同优先级和较低优先级的中断,然后调用已经注册的OAL ISR程序,一般ISR有下列特征:  1) 执行最小的中断处理,最小的中断处理指能够检验、答复产生中断的硬件,而把更多的处理工作留给IST(interrupt service thread)。  2) 当ISR完成时返回中断ID(中断ID大部分是预定义的)。  2. X86平台的ISR结构  X86平台的ISR保存在%_WINCEROOT%\PUBLIC\COMMON\OAK\CSP\I486\OAL\fwpc.中,函数名为PeRPISR。下面分析一下此函数的主要代码:
ULONG PeRPISR(void){ ULONG ulRet = SYSINTR_NOP; ///返回值,既中断ID(以SYSINTR_为前缀) UCHAR ucCurrentI ///当前中断号 if (fIntrTime) ////// fIntrTime 用于测试SR和IST的延时时间,测试工具为ILTiming.exe。  ......  ucCurrentInterrupt = PICGetCurrentInterrupt(); ////返回当前中断IRQ if (ucCurrentInterrupt == INTR_TIMER0) ///IRQ0,IRQ0为系统时钟(system tick)中断,具体见“二、实现系统时钟” ...... if (dwRebootAddress) ////是否需要重启动  RebootHandler();   ...... if(ucCurrentInterrupt == INTR_RTC) ////IRQ8,real-time clock的中断  ...... else if (ucCurrentInterrupt &= INTR_MAXIMUM) ///如果中断小于 INTR_MAXIMUM {  ulRet = NKCallIntChain(ucCurrentInterrupt); ////调用中断链  if (ulRet == SYSINTR_CHAIN) ///如果中断链未包含中断   ulRet = OEMTranslateIrq(ucCurrentInterrupt); ////在IRQ 和SYSINTR之间转换,此函数返回IRQ对应的SYSINTR   ......   PICEnableInterrupt(ucCurrentInterrupt, FALSE); ///启用除当前中断以外的所有中断 } ///else if OEMIndicateIntSource(ulRet); ///通知内核已经发生SYSINTR中断}  从以上代码不难看出ISR的任务就是返回以“SYSINTR_”为前缀的中断ID,如果不需要进一步执行IST,那么就返回SYSINTR_NOP。  3. 中断注册步骤  参考X86平台的代码,中断注册步骤如下:  1) 用SETUP_INTERRUPT_宏关联SYSINTR和IRQ。以“SYSINTR_”为前缀的常量由内核使用,用于唯一标识发生中断的硬件。在Nkintr.h文件中预定义了一些SYSINTR,OEM可以在Oalintr.h文件中自定义SYSINTR。  2) 用HookInterrupt函数关联硬件中断号和ISR。这里的硬件中断号为物理中断号,而非逻辑中断号IRQ。在InitPICs函数(和上述ISR位于同一文件)的最后调用了HookInterrupt函数,如下:
for (i = 64; i & 80; i++) HookInterrupt(i, (void *)PeRPISR); ///用ISR关联16个中断号   4. 中断处理步骤  1) 调用InterruptInitialize函数关联SYSINTR和IST,具体是关联IST等待的事件。一般在驱动程序中按如下编写:
hEvent = CreateEvent(...) ///创建一个事件对象InterruptInitialize(SYSINTR_SERIAL, hEvent, ...) ///关联一个串口中断ID和这个事件hThd = CreateThread(..., MyISTRoutine, hEvent, ...) ///创建一个线程(IST)CeSetThreadPriority(hThd, 152); ///提高此线程的优先级  2) IST执行I/O操作,一般IST按如下编写:
for(;;) ///驱动程序一直处于服务状态{ WaitForSingleObject(hEvent, INFINITE); ////无限等待事件 ...... //// I/O操作 InterruptDone(InterruptId); ///结束当前中断处理}  3) ISR和IST之间数据传输  假如我们要从一个设备频繁的读取数据而每次读取量非常少,那么每次读取都要调用IST会降低性能。作为解决方案,ISR可以做读取工作(存放到缓冲区),并在缓冲区存放满后由IST到缓冲区读取。因为ISR运行在内核模式而IST运行在用户模式,IST不能轻易地访问ISR的缓冲区,为此CE提供了一个办法(参见标题为“Passing Data between an ISR and an IST”的帮助文档),您也可以到询问。  二、实现系统时钟  1. 系统时钟(system tick)概念  系统时钟是内核需要的唯一中断(IRQ0),系统时钟每毫秒产生一个中断,当发生中断时内核在ISR中累计,到1000的倍数就是过了一秒钟。在处理系统时钟的ISR中不仅要累计计数,还要决定是否通知内核开始重新调度当前所有的线程。要实现一个OAL,系统时钟是第一个必须做的事。  2. X86平台系统时钟中断的处理工作 系统时钟由InitClock函数负责初始化工作,一般是在OEMInit函数中调用。当发生中断时,ISR首先用下列语句累计计数:
CurMSec += SYSTEM_TICK_MS; /////SYSTEM_TICK_MS = 1   然后根据下列语句判断应该返回什么值:
if ((int) (dwReschedTime C CurMSec) &= 0)  return SYSINTR_RESCHED; ///重新调度else return SYSINTR_NOP; ///不再执行任何操作  上述代码中全局变量dwReschedTime在schedule.c中定义,也就是由内核的调度模块决定在何时开始重新调度线程。CurMSec累计了从WindowsCE启动到当前总共产生了多少个system tick。实现系统时钟后还要实现OEMIdle函数,当没有线程准备运行时OEMIdle被调用,OEMIdle函数将置于空闲模式,但在空闲模式下仍然要累计系统时钟。  三、I/O控制代码  1. I/O控制代码作用  应用软件或者驱动程序可以调用KernelIoControl函数与OAL层通信,而KernelIoControl在内部调用OEMIoControl函数。OEMIoControl是一个OAL API,OEM可以在OEMIoControl中编写自己的I/O控制代码实现一些功能,或者说与应用软件通信。I/O控制代码常用的例子如重启计算机、得到系统信息、设置RTC、得到设备ID等。还有一些系统程序使用的特殊的I/O控制代码。在这里说明一下,我经过实验证实CE提供的得到设备ID方法并非有效。  2. 编写自己的I/O控制代码步骤  1) 在pkfuncs.h或者新编写一个.h文件中按如下格式定义:
#define IOCTL_MY_CONTROL CTL_CODE(FILE_DEVICE_HAL, 3000, METHOD_NEITHER, FILE_ANY_ACCESS)  2) 在oemioctl.c中修改OEMIoControl函数,添加如下代码:
case IOCTL_MY_CONTROL:......  3) 在应用程序中调用KernelIoControl函数,具体参数参见帮助文档。  结束语:  OAL所有接口函数和全局变量说明请参见标题为“Supported OAL APIs”的帮助文档。以前的文章《加密Windows CE系统》里介绍的 OEMLoadInit_t pOEMLoadInit 和 OEMLoadModule_t pOEMLoadModule 就是OAL暴露的用于创建可信任环境的全局变量,我们编写好了函数后就可以把函数地址赋给这两个变量。OAL的确很复杂,当实际需要时我们才会具体研究某一部分,因为带着问题研究是最有效率的。希望这两篇文章能够抛砖引玉,让更熟悉OAL的开发者能够公开自己的研究成果,和大家分享。  未经本文作者同意,不准擅自转载本篇文章。联系作者请邮至或
(作者:付林林责任编辑:方舟)
欢迎在新浪微博上关注我们
笔记本手机数码家电君,已阅读到文档的结尾了呢~~
转载一高手的帖子,有待偶去验证下,如果可用,用处大大的啊在实际开发过程中,经常希望能在应用程序中直接读写设备的物理空间。以前在做WinCE6 0下的MEMMgr时通过秘密加载一个内核态驱动实现了这个需求。但这种方式有一个明显的缺陷,每次读写都必须经由它才能完成。如果只是读取GPIO,那问题不算大。如果想通过这种方式实现视频播放的加速就比较困难了。估计非但不能加速,..
扫扫二维码,随身浏览文档
手机或平板扫扫即可继续访问
关于WinCE6 0 应用程序中直接访问物理地址
举报该文档为侵权文档。
举报该文档含有违规或不良信息。
反馈该文档无法正常浏览。
举报该文档为重复文档。
推荐理由:
将文档分享至:
分享完整地址
文档地址:
粘贴到BBS或博客
flash地址:
支持嵌入FLASH地址的网站使用
html代码:
&embed src='/DocinViewer-4.swf' width='100%' height='600' type=application/x-shockwave-flash ALLOWFULLSCREEN='true' ALLOWSCRIPTACCESS='always'&&/embed&
450px*300px480px*400px650px*490px
支持嵌入HTML代码的网站使用
您的内容已经提交成功
您所提交的内容需要审核后才能发布,请您等待!
3秒自动关闭窗口1042人阅读
WINCE Development Dairly(23)
CE6的一个设计目标是,向后兼容第三方的二进制应用程序。二进制形式的兼容包括:
1、& 兼容core库中的一些导出内容(如coredll.dll)
2、& 兼容所有导出函数的接口
3、& 兼容函数的功能,除非是函数因为新的内存布局和安全性而做的改变
4、& 即使函数不再支持了,但保持在coredll中的导出。这能让应用成功加载,但是运行时候可能会失败。不过即使使用不再支持的函数,失败的比例也不大,后面会继续讨论这个问题。
我们希望移植应用到CE6,能做最少的改动。大部分应用不需要改动,就能在CE6上正常运行。对应用程序的影响,取决于应用程序是否按规则编写。一个良好按规则编写的应用,是只使用SDK功能、不使用其他文档没有提及的功能、不使用OAL函数、不使用本文提到的其他方面(如传递句柄的值、传递内存指针、假定组件的运行是和内存映射文件那样,等等)。所谓的SDK功能,是指SDK安装后有效的功能,如mobile的PPC SDK或者PB生成的CE SDK。应用只使用文档中列出的SDK函数,那么移植到CE6上,改动就会很少。
下面来看看CE6的变动,CE6提供新的内存管理,会影响到第三方的应用程序。
函数有三个主要的变动:
1、 函数的改变:
下面列出CE6完全改变了的函数,这些函数依然由coredll导出,但它们的调用会返回错误或者什么都不干。如下:
内存指针函数,如MapCallerPtr。每个进程现在有2GB的空间(不包括内核那的2GB),从一个进程传递内存指针到另一个进程,包括读其他进程的内存,或者建立进程内存的虚拟复制。这些操作都由标准的SDK函数提供,而不再是基于slot机制的函数。
进程索引函数,如GetProcessIndexFromId。进程数目已经增长到32768个,因此CE6中不再提供这些函数(CE只能有32个进程,提供这些函数还比较方便)。
权限函数,如SetProcPermissions。由于现在没有进程slot的机制了,所以也不提供这些功能。现在需要通过OpenProcess来得到一个有效进程句柄,然后通过标准SDK函数,去访问进程的内存。
所有这些无用的函数,现在通过debug check来检查。放到一个调试区域中了,在coredll中打开(DBGDEPRE == 0x40)
2、& 只在内核中使用的函数。这类函数只能在0x以上的地址内被调用(内核空间),这对应用程序影响不大,大部分都是硬件相关的函数,如中断、物理地址映射、进程内存分配等。这些函数会影响到驱动。
3、& 不鼓励使用的函数。这类函数有了新的替换函数,或者工作的更好了。这里有些函数包括PSL服务的检查(WaitForAPIReady由于是不能主动激活,现由IsAPIReady代替,完全支持128个函数),文件映射等(CreateFile/CreateFileMapping替换为 CreateFileForMapping)。
PB发布了一个PC端工具,应用程序(exe和dll)可以来检查函数是否属于以上三种类型,工具会列出:
Name: ceappcompat.exeLocation: public/common/oak/bin/i386Usage: 运行桌面工具,在一个目录下去扫描 dll/exe或者所有的文件Results:最后,工具生产HTML文件,列出所有符合的函数,和这些函数的用法。
这个工具检查二进制文件中,函数调用列表中的模块。但这个工具不能检查出,通过指针方式调用的函数。
CE6以前的版本中,句柄是全局的,所有应用都能访问到。
CE6中,句柄是每个进程特有的。一个应用程序中的句柄,对于其他进程是没有意义的。除非这些句柄使用DuplicateHandle函数,映射到其他进程中。
对应用程序的影响:如果应用程序从其他进程接收到句柄的值,需要调用DuplicateHandle创建一个句柄的备份,到当前的进程中,才能被正确的使用上。
CE6以前的版本也有DuplicateHandle函数,但只针对mutex、semaphore、event等对象。CE6中扩展为支持任何句柄,如函数句柄、消息队列句柄、进程线程句柄或者其他进程的句柄指针等。
内存指针:
CE6以前的版本中,虚拟内存(VM:virtual memory)是基于一个内存分布的设计下,所有应用的虚拟内存都处于同一个4GB的空间中。内核有自己的2GB空间,下端的2GB空间分了32个slot给应用使用。这种设计下,从一个进程得到另一个进程的内存指针就比较容易。
CE6中,虚拟内存是基于并列的多个内存分布设计的,内核依然有2GB空间。但每个应用邮自己独立的2GB空间。它们之间有一小块共享堆和dll的空间,这里不做讨论。其他的空间归属各个进程,因此通过简单的传递内存指针,来达到访问的目的是不可能的。
对应用的影响,如果应用以前通过MapCallerPtr来得到其他进程的内存指针,那CE6中就不能这样做了。把这些直接读写进程内存的代码,修改为SDK函数ReadProcessMemory 或WriteProcessMemory。这些函数能让你获得其他进程的权限(用SDK函数OpenProcess打开的句柄)。
这是CE6以前版本中,进程空间只有32M的限制导致的问题。
注意,不要使用SDK函数去读写内核进程的内存。应用程序是不能访问内核空间的。然而应用程序也不能写入共享堆0x的地址,应用程序只能对共享堆只读,而内核可以读写共享堆的内容。
函数处理:
CE6以前版本中,如果应用传入一个无效方式到PSL服务,内核会简单的继续PSL服务。有一些情况可能会让PSL产生异常,或者返回错误。
CE6中,如果产生这样情况,在内核层就被拒绝了,由PSL服务决定是否标记为函数错误句柄。如果PSL不标记为函数错误句柄,一个异常会返回到调用者函数中。如果调用者函数没有异常处理的话,这个线程就会结束。如果PSL服务通过内核标记了函数错误句柄,内核会让错误句柄继续调用下去,这类似CE6以前的做法。
函数的信任检查:
这不属于向后兼容的内容,但注意的是CE6中所有信任检查函数,都会返回可信任。OEM可以通过SYSGEN_CERTMOD,来生产带有信任检查的镜像。
中断函数:
CE6以前版本中,应用可以使用中断函数。WM中只能在被信任应用中使用。
CE6中,中断函数只能在内核态中或者用户态驱动中使用。如在用户态其他组件中使用,会返回FALSE。
对应用的影响很小,大部分要使用这些函数是驱动,而不是第三方应用。如想在内核态外使用的话,那只能为应用编写驱动(用户态驱动较好)了。
物理内存映射:
CE6以前版本,所有应用都能用VirtualCopy或MmMapIoSpace来建立物理和虚拟内存的映射。WM中只能是可信任模块使用。
CE6中,这部分调用只能在内核态或者用户态驱动中。这可能限制了第三方软件的一些使用,但这样设计能加强稳定性和弹性。
可以通过内核态驱动或者公开的组件,来给应用使用这部分功能。下面会提到。
OAL的Ioctl代码:
CE6以前,用户态可以通过KernelIoControl或KernelLibIoControl,调用OAL的代码。
CE6中,为了提供更好的安全性,能给用户态调用的函数被预先定义好(即使应用是被信任的,CE6中没有应用信任的概念),限制在部分的功能内。OEM厂商必须明白和确认,那些是用户态应用程序可以使用的ioctl。例如,应用程序需要使用IOCTL_HAL_REBOOT,除非在应用的ioctl列表中添加此功能,否则还是不能调用。下面列出部分用户态缺省可以调用的ioctl。
IOCTL_HAL_GET_CACHE_INFOIOCTL_HAL_GET_DEVICE_INFOIOCTL_HAL_GET_DEVICEIDIOCTL_HAL_GET_UUIDIOCTL_PROCESSOR_INFORMATION
内存映射文件:
CE6以前版本,使用内存映射的文件的虚拟内存,是在应用程序slot外面空间中申请的。那么个文件对应地址是唯一的,而且所有应用都可以访问到。另外,获取访问此映射文件的返回值,和使用相同名字申请映射文件的返回,是不一样的。
CE6中,申请内存映射文件的虚拟地址,是在当前应用空间内部了。那么一个进程创建了的映射文件,不能被其他进程访问,除非是由SDK函数打开以后。同样,对此映射文件的权限完全由创建者控制,而不会关心之前这个对象有没有存在过。
如果应用有传递内存映射文件的句柄,给其他进程时候的话。那现在就不能这样去访问了。需要把此文件的名字传递给其他进程,使用这个打开后,才能进行读写。假如应用用只读权限打开一个映射文件,而系统已经存在一个相同名字、可读写的映射文件。CE6以前的版本中,打开者也拥有了读写权限。而CE6中,打开者只能有只读的权限。因此,检查应用有使用到CreateFileMapping 和 MapViewOfFile的地方。
&&相关文章推荐
参考知识库
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:81069次
排名:千里之外
原创:10篇
转载:37篇
评论:19条
(1)(1)(1)(1)(3)(2)(1)(1)(1)(1)(2)(2)(4)(11)(3)(7)(3)(2)想在自己的程序里面实现屏幕黑屏,但是鼠标点击的功能依然存在,程序也继续运行,黑屏一段时间后重新恢复。
请问有什么函数可以实现吗?
在线时间0 小时
TA的帖子TA的资源
一粒金砂(初级), 积分 0, 距离下一级还需 5 积分
一粒金砂(初级), 积分 0, 距离下一级还需 5 积分
奇怪,不能修改帖子的啊?
想说明一下,不能使用“新建一个窗体,令其无标题栏,令其运行时最大化,令其背景为黑色”的方法。
在线时间0 小时
TA的帖子TA的资源
一粒金砂(初级), 积分 0, 距离下一级还需 5 积分
一粒金砂(初级), 积分 0, 距离下一级还需 5 积分
楼上的方法果然高明,但是小聪明终究不能用到实际项目中,不然会被同行笑的,其实楼主的意思应该是关闭显示器吧,相当于动态控制屏幕保护功能,有两种方法,一种是在wince内核里做,就是做个屏幕保护程序,但是恐怕要相应的显示驱动支持,这需要问你的BSP厂家到底实现了这个功能没有,因为很多板子是没有这个功能的,还有个方法,使用BIOS中的关闭显示器功能,可以使用下面的代码,具体自己去编译:
#define IOCTL_HAL_SCREENOFF CTL_CODE(FILE_DEVICE_HAL, 0x1102, METHOD_BUFFERED, FILE_ANY_ACCESS)
#define IOCTL_HAL_SCREENON CTL_CODE(FILE_DEVICE_HAL, 0x1103, METHOD_BUFFERED, FILE_ANY_ACCESS)
void CloseCreen(m_sleep)
& && &&&if(m_sleep == 1)
& & & & & & & & m_sleep = 0;
& & & & & & & & KernelIoControl(m_sleep ? IOCTL_HAL_SCREENON : IOCTL_HAL_SCREENOFF, NULL, 0, NULL, 0, NULL);
& & & & else
& & & & & & & & m_sleep = 1;
& & & & & & & & Sleep(300);
& & & & & & & & KernelIoControl(m_sleep ? IOCTL_HAL_SCREENON : IOCTL_HAL_SCREENOFF, NULL, 0, NULL, 0, NULL);
在线时间1 小时
TA的帖子TA的资源
提示: 作者被禁止或删除 内容自动屏蔽
在线时间0 小时
TA的帖子TA的资源
一粒金砂(初级), 积分 0, 距离下一级还需 5 积分
一粒金砂(初级), 积分 0, 距离下一级还需 5 积分
严重同意 2 楼。。。。。。
查看注册表中是否有背光控制的部分。 使用标准的电源管理函数,给背光驱动发送关闭背光的命令 也就是设置他的电源状态。。。
SetPowerState& &等,查看Help吧
在线时间0 小时
TA的帖子TA的资源
一粒金砂(初级), 积分 0, 距离下一级还需 5 积分
一粒金砂(初级), 积分 0, 距离下一级还需 5 积分
刚刚先在一个对话框里测试了一下,在dialog类调用这个函数,
void CloseCreen(m_sleep)
& && &&&if(m_sleep == 1)
m_sleep = 0;
KernelIoControl(m_sleep ? IOCTL_HAL_SCREENON : IOCTL_HAL_SCREENOFF, NULL, 0, NULL, 0, NULL);
m_sleep = 1;
Sleep(300);
KernelIoControl(m_sleep ? IOCTL_HAL_SCREENON : IOCTL_HAL_SCREENOFF, NULL, 0, NULL, 0, NULL);
=============================
不过似乎没有反应,请问应该在哪里调用才对呢?
在线时间1 小时
TA的帖子TA的资源
一粒金砂(初级), 积分 0, 距离下一级还需 5 积分
一粒金砂(初级), 积分 0, 距离下一级还需 5 积分
KernelIoControl
要系统底层支持才行, 如果驱动没有支持,也许不能实现这一的功能吧
简单的办法&&将系统那个 背光的驱动 类似backligh.dll拷贝出来,看看dll里面有哪些接口
在线时间0 小时
TA的帖子TA的资源
一粒金砂(初级), 积分 0, 距离下一级还需 5 积分
一粒金砂(初级), 积分 0, 距离下一级还需 5 积分
嗯,谢谢ls。
刚刚试了一下以下方法,也是不能实现,根据返回值应该是驱动不支持。
我试看看你的方法
=======================================
关闭屏幕& & 如果系统有有色背光显示,主要的电源消耗不是CPU而是背光。在一些环境下,一个应用程序需要运行却不需要显示在屏幕上。一个例子是音乐播放器应用程序,当用户听音乐的时候,不关注屏幕。在这些情形下,有能力关闭背光将意味着提高电池寿命。& & 当然,当用户想看屏幕时,任何关闭背光应用程序的需要一个简单的用户友好的方式来重新打开屏幕。同样,记得用户典型的想法是屏幕变黑时会认为被关闭了,因此要考虑这点。举个例子,一个用户可能在系统已经运行时试图打开系统电源,并且这样做了,却很意外地发现,设备电源被关闭了。同样,当系统在这种情况下关闭显示,它同时也关闭了触摸屏。这意味着你不能告诉用户敲击屏幕来打开。而是,你需要使用一些其他的事件,比如设置时间,任务完成,或用户按了一个按钮。最后,这里讨论的方式对大多数基于Windows CE 3.0或更新的版本比较有用,并且被Windows CE .NET 4.0中的电源管理程序所替代。对于较新的系统,先看看是否电源管理程序可用,然后通过它来控制屏幕。如果失败了,ExtEscape方式也许能行。& & 在Windows CE中,显示的控制是通过Ext?Escape函数。这是一个显示和打印机驱动的后门。Windows CE显示驱动支持许多设备转义代码(escape codes),这些被公布在Platform Builder中。对于我们的目的来说,只有两个转义代码被用到:SETPOWERMANAGEMENT来设置显示的电源状态和QUERYESCSUPPORT来查询是否SETPOWERMANAGEMENT被驱动支持。下面的例子打开或关闭系统显示通过显示驱动,并且支持完全的转义代码:
// Defines and structures taken from pwingdi.h in the Platform Builder
#define QUERYESCSUPPORT& && && && && && &8
#define SETPOWERMANAGEMENT& && && && && &6147
#define GETPOWERMANAGEMENT& && && && && &6148
typedef enum _VIDEO_POWER_STATE {
& && && &VideoPowerOn = 1,
& && && &VideoPowerStandBy,
& && && &VideoPowerSuspend,
& && && &VideoPowerOff
} VIDEO_POWER_STATE, *PVIDEO_POWER_STATE;
typedef struct _VIDEO_POWER_MANAGEMENT {
& && && &ULONG L
& && && &ULONG DPMSV
& && && &ULONG PowerS
} VIDEO_POWER_MANAGEMENT, *PVIDEO_POWER_MANAGEMENT;
//----------------------------------------------------------------------
// SetVideoPower - Turns on or off the display
int SetVideoPower (BOOL fOn) {
& && && &VIDEO_POWER_MANAGEMENT
& && && &int rc, fQueryE
& && && &HDC
& && && &// Get the display dc.
& && && &hdc = GetDC (NULL);
& && && &// See if supported.
& && && &fQueryEsc = SETPOWERMANAGEMENT;
& && && &rc = ExtEscape (hdc, QUERYESCSUPPORT, sizeof (fQueryEsc),
& && && && && && && && & (LPSTR)&fQueryEsc, 0, 0);& &
& && && &if (rc == 0) {
& && && && & // No support, fail.
& && && && & ReleaseDC (NULL, hdc);
& && && && & return -1;
& && && &}
& && && &// Fill in the power management structure.
& && && &vpm.Length = sizeof (vpm);
& && && &vpm.DPMSVersion = 1;
& && && &if (fOn)
& && && && & vpm.PowerState = VideoPowerOn;
& && && &else
& && && && & vpm.PowerState = VideoPowerO
& && && &// Tell the driver to turn on or off the display.
& && && &rc = ExtEscape (hdc, SETPOWERMANAGEMENT, sizeof (vpm),
& && && && && && && && & (LPSTR)&vpm, 0, 0);& &
& && && &// Always release what you get.
& && && &ReleaseDC (NULL, hdc);
& && && &return 0;
& & 前面的代码通过调用ExtEscape和QUERYESCSUPPORT命令来查询是否支持转移代码。被查询的命令首先交给输入缓冲,如果SETPOWERMANAGEMENT命令被支持,程序就填充VIDEO_POWER_MANAGEMENT结构并再次调用ExtEscape设置电源状态。& & 虽然这些转义代码允许应用程序打开或关闭显示,Windows CE没有一个统一的方式来控制背光的亮度。每个系统都有它自己的OEM特有方式来控制背光亮度。如果将来有一种标准的背光
在线时间1 小时
TA的帖子TA的资源
一粒金砂(初级), 积分 0, 距离下一级还需 5 积分
一粒金砂(初级), 积分 0, 距离下一级还需 5 积分
引用 1 楼 zhengguodun 的回复:
奇怪,不能修改帖子的啊?
想说明一下,不能使用“新建一个窗体,令其无标题栏,令其运行时最大化,令其背景为黑色”的方法。
这个也能想出来。牛啊。
在线时间0 小时
TA的帖子TA的资源
一粒金砂(初级), 积分 2, 距离下一级还需 3 积分
一粒金砂(初级), 积分 2, 距离下一级还需 3 积分
SetPowerState基本要求电源驱动的支持,基本很多板子都不支持,控制BIOS是万能用法,所有的板子都能用,楼主多研究下吧。
在线时间14 小时
TA的帖子TA的资源
一粒金砂(初级), 积分 0, 距离下一级还需 5 积分
一粒金砂(初级), 积分 0, 距离下一级还需 5 积分
引用 2 楼 dthxman 的回复:
楼上的方法果然高明,但是小聪明终究不能用到实际项目中,不然会被同行笑的,其实楼主的意思应该是关闭显示器吧,相当于动态控制屏幕保护功能,有两种方法,一种是在wince内核里做,就是做个屏幕保护程序,但是恐怕要相应的显示驱动支持,这需要问你的BSP厂家到底实现了这个功能没有,因为很多板子是没有这个功能的,还有个方法,使用BIOS中的关闭显示器功能,可以使用下面的代码,具体自己去编译:
#define IOCTL_HAL_SCREENO…
ce5.0 返回错误 50(The request is not supported. )
在线时间0 小时
TA的帖子TA的资源
一粒金砂(初级), 积分 0, 距离下一级还需 5 积分
一粒金砂(初级), 积分 0, 距离下一级还需 5 积分
引用 7 楼 zhengguodun 的回复:
嗯,谢谢ls。
刚刚试了一下以下方法,也是不能实现,根据返回值应该是驱动不支持。
我试看看你的方法
=======================================
关闭屏幕& & 如果系统有有色背光显示,主要的电源消耗不是CPU而是背光。在一些环境下,一个应用程序需要运行却不需要显示在屏幕上。一个例子是音乐播放器应用程序,当用户听音乐的时候,不关注屏幕。在这些情形下,有能力关闭背光将意味着提高电池寿命。& & 当然,当用户…
ce5.0 返回错误 6(The handle is invalid. )
rc = ExtEscape (hdc, QUERYESCSUPPORT, sizeof (fQueryEsc),
& && && && && && && && &(LPSTR)&fQueryEsc, 0, 0);&&
& && &&&if (rc == 0) {
DWORD dwError = GetLastError();
& && && && &// No support, fail.
& && && && &ReleaseDC (NULL, hdc);
& && && && &return -1;
在线时间0 小时
TA的帖子TA的资源
一粒金砂(初级), 积分 2, 距离下一级还需 3 积分
一粒金砂(初级), 积分 2, 距离下一级还需 3 积分
这个有万能的方法吗?
我一直都是要求设备方直接提供控制方法的。
在线时间0 小时
TA的帖子TA的资源
一粒金砂(初级), 积分 0, 距离下一级还需 5 积分
一粒金砂(初级), 积分 0, 距离下一级还需 5 积分
关掉背光~~~可以考虑通过pwm来实现~~或者自己写一个屏幕保护程序,一定时间内激发该程序~~然后用键盘或触屏时间唤醒~
在线时间0 小时
TA的帖子TA的资源
一粒金砂(初级), 积分 0, 距离下一级还需 5 积分
一粒金砂(初级), 积分 0, 距离下一级还需 5 积分
这个没有万能的方法吧,如果ce5.0要看硬件设计,和底层驱动是否按标准接口实现.如果mobile一般都是标准的.
在线时间1 小时
TA的帖子TA的资源
一粒金砂(初级), 积分 0, 距离下一级还需 5 积分
一粒金砂(初级), 积分 0, 距离下一级还需 5 积分
看驱动是否支持。
在线时间1 小时
TA的帖子TA的资源
一粒金砂(初级), 积分 2, 距离下一级还需 3 积分
一粒金砂(初级), 积分 2, 距离下一级还需 3 积分
在线时间0 小时
TA的帖子TA的资源
一粒金砂(初级), 积分 2, 距离下一级还需 3 积分
一粒金砂(初级), 积分 2, 距离下一级还需 3 积分
EEWORLD 官方微信
Powered by
逛了这许久,何不进去瞧瞧?

我要回帖

更多关于 wince6升级至wince7 的文章

 

随机推荐