详解WINCE的控制面板

曾经在我的一篇《控制面板的创建》中介绍过WinCE控制面板的结构,不过由于那篇文章其目的只在于控制面板如何调用EXE程序,故对控制面板也仅是泛泛而谈.不过在这篇文章中,我们将对WinCE的使用方法来个整体的详解.
        
1.控制面板的结构
        控制面板其实也是个动态链接库,区别只在于后缀名为.cpl,以及对外接口为CPlApplet().
        接口的原型为:
        LONG CALLBACK CPlApplet(HWND hwndCPL,UINT message, LPARAM lParam1, LPARAM lParam2)
        在接口函数中我们需要实现特定几个消息的响应,控制面板才能正常运作.为方便观察,在这里直接贴出消息的响应结构:
        
// =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
// The entry point to the Control Panel application.
// =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
extern "C"  LONG CALLBACK CPlApplet(HWND hwndCPL,UINT message, LPARAM lParam1, LPARAM lParam2)
{
  switch (message)
  {
    case CPL_INIT:
          // Perform global initializations, especially memory
          // allocations, here.
          // Return 1 for success or 0 for failure.
          // Control Panel does not load if failure is returned.
          return 1;

    case CPL_GETCOUNT:
          // The number of actions supported by this Control
          // Panel application.
          return 1;

    case CPL_NEWINQUIRE:
        {
              // This message is sent once for each dialog box, as
              // determined by the value returned from CPL_GETCOUNT.
              // lParam1 is the 0-based index of the dialog box.
              // lParam2 is a pointer to the NEWCPLINFO structure.
                return 0; //means CPLApplet succeed
                return 1;  // Nonzero value means CPlApplet failed.
            }
    case CPL_DBLCLK:
            {
              // The user has double-clicked the icon for the
              // dialog box in lParam1 (zero-based).
                return 0;     // CPlApplet succeed.
                return 1;     // CPlApplet failed.
            }
            
    case CPL_STOP:
                // Called once for each dialog box. Used for cleanup.
                
    case CPL_EXIT:
                // Called only once for the application. Used for cleanup.
                
    default:
          return 0;
  }

  return 1;  // CPlApplet failed.
}  // CPlApplet

        这几个消息的作用分别是:
        CPL_INIT:初始化,可以在这分配内存等等.
        CPL_GETCOUNT:返回控制面板程序的个数.因为一个.cpl文件中,可能包含多个Applets.
        CPL_NEWINQUIRE:返回包含程序名和图标信息的NEWCPLINFO结构
        CPL_DBLCLK:双击时响应
        CPL_STOP:单个组件退出时响应,用来清除资源内存等
        CPL_EXIT:退出整个cpl程序时响应
        这些消息的定义可以在cpl.h中找到
        
        
2.在explorer中使用
        如果定制的系统中带有explorer UI,只要把编译好的文件放进"\windows",然后再打开"控制面板"就可以看到.
        
        
3.如何调用.cpl
        就像PC机中.dll文件不能直接运行,需要借助rundll32.exe来运行一样,WinCE下的.cpl也需要相应的程序来调用,这个程序就是:"ctlpnl.exe".
        比如我们需要调用系统自带的cplmain.cpl的"电源管理",只要在开始菜单的运行中输入:"ctlpnl.exe \windows\cplmain.cpl,5".在路径后面紧跟的"5"只是因为"电源管理"在cplmain.cpl中输入第五个Applet而已.
        由此我们不难得出在程序中运用ShellExecuteEx()函数调用控制面板的Applet的方法.以下这段代码,效果和在命令行中输入命令一样,也是调用"电源管理".
        SHELLEXECUTEINFO info;    
        TCHAR szControlPanelCmdLine[ 200 ];
    swprintf( szControlPanelCmdLine, L"\\windows\\cplmain.cpl,5");
        info.cbSize = sizeof( info );
        info.fMask = SEE_MASK_NOCLOSEPROCESS | SEE_MASK_FLAG_NO_UI;
        info.lpVerb = NULL;
        info.lpFile = TEXT("ctlpnl.exe");
        info.lpParameters = szControlPanelCmdLine;
        info.lpDirectory = NULL;
        info.nShow = SW_SHOW;
        info.hInstApp = NULL;
        ShellExecuteEx( &info );    
        
        如果想调用cplmain.cpl的其它Applet,只要把数字改为相对应的即可.
        以下所列的第一项序号为0,接下的为1,其后的继续递增.
        0        CPL_Comm    
    1        CPL_Dialing 
    2        CPL_Keyboard 
    3        CPL_Password
    4        CPL_Owner   
    5        CPL_Power   
    6        CPL_System  
    7        CPL_Screen    
    8        CPL_Mouse   
    9        CPL_Stylus  
    10    CPL_Sounds  
    11    CPL_SIP"     
    12    CPL_Remove  
    13    CPL_DateTime 
    14    CPL_Certs      
    15    CPL_Accessib 
    

4.系统自带控制面板的代码
        微软对控制面板的代码是完全公开的,如果安装的是PB4.2,代码可以在"\PUBLIC\WCESHELLFE\OAK\CTLPNL"中找到.
        CTLPNL文件夹中有九个文件夹,分别对应不同的CPL文件:
        ADVBACKLIGHT:高级背光灯管理
        BTHPNL:蓝牙
        CONNPNL:拨号网络
        CONTROL:主控制台,我们在explorer中看到的"控制面板"应该就是这个
        CPLMAIN:会生成cplmain.cpl,控制面板的大多数选项均源自于此
        CTLPNL:和CONTROL相关联的
        DMPNL:没使用过,不太清楚.不过查看rc文件应该是设置上网的.
        INTL2:区域和语言设置
        STGUI:存储器管理

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/436113.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【转】设置Win32窗口背景颜色

窗口类结构体中,有一个窗口背景成员,hbrBackground。它是一个画刷句柄类型。在Windows中有各种各样的句柄,比如窗口句柄、实例句柄,画刷句柄,文件句柄等等,他们都是句柄类型,只是每一种句柄都和…

oracle中plsql块的结构,oracle plsql的结构

变量声明部分(没有变量可以不写declare)begin执行部分exception异常处理部分end*:declare 和 exception部分是可选的(1)PL/sql中变量的定义格式1变量名 变量类型 【约束】 default 默认值格式2变量名 变量类型 【约束】【:初始值】(2)一个简单的PL/sql块…

【转】Dicom文件解析!!!!!!

转自:https://blog.csdn.net/leaf6094189/article/details/8510325 Dicom全称是医学数字图像与通讯,这里讲的暂不涉及通讯那方面的问题 只讲*.dcm 也就是diocm格式文件的读取,读取本身是没啥难度的 无非就是字节码数据流处理。只不过确实比较…

VS2008 JS脚本调试总是调试旧代码 真不知道怎么回事?谁能帮帮我呀!

如图,[dynamic]标记的是调试的元文件 xml1.htm[dynamic]和xml.js[dynamic] 我更改后的文件是xml1.htm和xml.js,见图1 2 调试的文件有debugger 更改后的文件我把debugger注了 js脚本中我把变量给改了见3 4 ,所以在浏览新的xml1.htm时,竟然报对象找不到,真实受不了了!!! 为什么我…

蜂窝注册表和永久存储

WindowsCE有两种注册表,一种是基于RAM的,一种是基于蜂窝的注册表;WindowsCE会默认使用前者。如果是使用前者,PB在编译的时候会先把common.reg、platform.reg、project.reg及所有的.reg文件的内容合并到reginit.ini文件&#xff0c…

修改oracle默认日期,Oracle 修改默认日期格式

1、Oracle的日期格式Oracle数据缺省的时间格式数据的显示形式,与所使用的字符集有关。一般显示年月日,而不显示时分秒。例如,使用us7ascii字符集(或者是其他的英语字符集)时,缺省的时间格式显示为:28-Jan-2003&#xf…

【转】C#开发PACS医学影像处理系统(一):开发背景和功能预览

转自:https://www.cnblogs.com/Uncle-Joker/p/13646949.html 本系列文章将从以下模块和大家分享和讨论使用C#开发医学软件PACS和RIS系统, 国内相关资料比较少,也借此机会丰富一下医学软件开发生态,讨论技术难点,希望…

《WF编程》系列之30 - 基本活动:错误处理

《WF编程》系列之30 - 基本活动:错误处理 4.3 错误处理 Fault,故障,现在官方已经将其翻译为错误,那么以后的随笔中我也就采用官方的翻译吧. 错误处理也属于流程控制的一部分,这一节我来介绍一下有关错误处理的活动.错误是指在工作流执行期间发生的异常.我们可以使用错误处理程…

wince 自动启动程序设置

这是我在做wince6的时候为设置自启动而寻找的方法。我发现公司定的这个设备在“Program Files”和windows文件夹下放置的东西在机子重启之后就什么都没有了。我只有使用注册表测试,发现重启后还存在,因此我用注册表方式设置了自启动。而在这个过程中&…

oracle错误27101,ORA-27101ORA-01034错误解决

Oracle已经启动,连接sqlplus后,进行查询,出现下面错误ORA-01034: ORACLE not availableORA-27101: shared memory realm doesOracle已经启动,连接sqlplus后,进行查询,出现下面错误ORA-01034: ORACLE not av…

NOD32升级ID获取器For流星无语更新了

NOD32升级ID获取器For流星无语更新了一下,现在可以直接把用户名密码写入注册表了,连复制/粘贴操作都可以免了...转载于:https://www.cnblogs.com/lxwy/archive/2008/09/05/4420722.html

string也可以很精彩

// //TITLE: // string也可以很精彩 //AUTHOR: // norains //DATE: // Moday 03-November-2008 //Environment: // NONE // 对于习惯于MFC架构的朋友来说,估计直接采用API方式写代码最痛苦的莫过于没有CString。其实,在STL里面&#xff…

oracle存储过程行转列,oracle 存储过程-动态行转列,解决。

create or replace package body pro_test isprocedure Alarm_ContentsByTime(p_StartTime varchar2,----开始时间p_EndTime varchar2,----结束时间io_cursorinOUT out_cursor)iscursor cursor_1 IS--获取 列用于循环。select DISTINCT t.ps_productorcode code, t.PS_PRODUCTO…

【转】【C#】使用fo-dicom完成BMP,JPG,PNG图片转换为DICOM文件

转自:https://developer.aliyun.com/article/672065 最近研究了一下DICOM和BMP文件转换的问题,也是很头大。度娘了很久,也在CSDN等论坛看到一些断断续续的文件,最主要的是代码只是片断,不是完整的实现。头大了。 首先…

(转载)攻击方式学习之(1) - 跨站式脚本(Cross-Site Scripting)

原文地址:http://www.cnblogs.com/coderzh/archive/2008/09/06/1285500.html 声明:本文仅供学习研究之用,对于本文提到的某些网站的XSS漏洞,请读者发扬高尚的人道主义精神不要去危害他人,同时希望相应的网站能够尽快修…

C++设计模式之二 AbstractFactory模式

设计模式的目的就是尽量减少“变化”对程序的影响,尤其是对客户程序的影响。AbstractFactory模式作为创建型模式的一种,解决的就是“new”在变化中可能引起的问题。 先来看看new有何种不好,举个创建汽车的车门的例子: 很自然的一…

oracle win10配置命令,记一次Windows 平台下Oracle 10.2.0.5 EM重新配置

1. 删除EM资料库、dbconsole配置D:\>emca -deconfig dbcontrol db -repos dropEMCA 开始于 2013-2-20 9:53:17EM Configuration Assistant, 10.2.0.5.0 正式版版权所有 (c) 2003, 2009, Oracle。保留所有权利。输入以下信息:数据库 SID: ora10g监听程序端口号: 1521SYS 用户…

【转】Dicom 学习笔记-Dicom 消息服务(DIMSE-C/DIMSE-N)

转自:https://www.jianshu.com/p/2812b0b6e548 引言 DICOM(Digital Imaging and Communications in Medicine)医学数字成像与通信,是医疗影像领域一个非常重要的标准,本文主要简单介绍 DICOM 标准中的消息交换服务。在介绍之前先声明一下&am…

改写DataCogs在MOSS列表中实现三级联动字段

项目中有需求需要实现列表中3级的字段联动。参照小熊的[分享]修复DataCogs二级联动FieldControl支持中文 ,改造一下,实现了3级联动字段。另外,还可以实现一个列表中同时有两个,或两个以上互相独立的联动字段, 详细的字…

wince 常见问题

1 在mediaplayer全屏播放的时候,我可以用键盘上的某一个键调节声音大小,现在我想在屏幕上显示调节的结果就跟我们看电视一样能出来一些标记。当声音变大在屏幕上就增多, 当声音变小的时候就减少 得到播放窗口的DC,然后在上面显示…