现代职业教育杂志社 > 现代职业教育论文中心 >

利用Delphi编写Windows控制面板组件及实例

2015-03-25  |  点击:  |  栏目:现代职业教育论文中心

 

    在Windows95/NT/98操作系统中,控制面板(Control Panel)提供了定制Windows的操作方法,通过它可以完成设置打印机、显示、网络、添加新硬件等功能。通常控制面板包含20多个组件(*.CPL),分别负责系统某一方面的设置。鼠标双击任一组件图标,控制面板调用相应程序,弹出对话框,允许设置系统参数。确认修改后系统参数保存在Windows注册表或某一配置文件(*.INI)中。

    一、控制面板组件基础知识

    控制面板是一个Windows应用程序C:\WINDOWS\CONTROL.EXE,其配置文件是C:\WINDOWS\CONTROL.INI。控制面板组件是一些动态链接库,其扩展名不是DLL,而是CPL。通常,控制面板组件保存在C:\WINDOWS\SYSTEM\目录下。在CONTROL.INI中有一个[MMCPL]节,该节可指定由CONTROL.EXE调用的动态链接库,其格式一般为:

...

[MMCPL]

uniqueName=D:\PROJECT1.DLL(这里假设PROJECT1为用户编写的控制面板组板文件

名,其访问路径可由读者自行确定)

...

采用此方法,PROJECT1.DLL不必存放在C:\WINDOWS\SYSTEM\目录下,扩展名不必改为CPL。CONTROL.EXE运行后按以下顺序调用这些动态链接库:

  • 在C:\WINDOWS\SYSTEM\目录下调用MAIN.INI。
  • 已加载并输出CplApplet()函数的可安装驱动程序。
  • 在CONTROL.INI[MMCPL]节中指定的DLL。
  • 在C:\WINDOWS\SYSTEM\目录下调用CPL。
  •     因此,编写控制面板组件近似于编写普通DLL。通常一个CPL支持控制面板中的一个组件(即一个图标),也可支持多个组件。本文介绍利用Delphi编写CPL、扩充控制面板组件(一个CPL支持一个或多个组件)的方法。

        二、控制面板组件工作流程

        1、每个CPL文件必须输出一个CplApplet函数,与CONTROL.EXE之间传递、处理消息。CplApplet函数的原形是:

    type

    TCPLApplet = function (hwndCPl: THandle; uMsg: DWORD;

    lParam1, lParam2: Longint): Longint; stdcall;

        其中,hwndCPl是控制面板窗口句柄,uMsg是消息标识,lParam1、lParam2是两个附加参数,具体意义视uMsg的值而定。

        2、当CONTROL.EXE把各CPL(或DLL)调入内存时,CONTROL.EXE立刻向CPLApplet发送一条CPL_INIT消息,要求CPL执行全局初始化并分配内存。CPL_INIT是唯一可以返回调用失败的消息。如果初始化成功,CPL返回非零,否则返回零。如果CPL返回零,控制面板终止与CPL通信并卸载此CPL(或DLL)。

        3、CPL_INIT消息处理结束后,CONTROL.EXE立刻向CPLApplet发送一条CPL_GETCOUNT消息,CPL返回支持的组件数。

        4、CPL_GETCOUNT消息处理结束后,CONTROL.EXE立刻向CPLApplet发送一条CPL_NEWINQUIRE消息,CPL_NEWINQUIRE每次发送一条,以取得每个组件的图标、名称、提示内容(显示在控制面板的状态栏)等信息。lParam1是指定对话框的数值,该值应在0到(CPL_GETCOUNT - 1)之间。如果CPL_NEWINQUIRE处理成功,返回0。

        说明:

        ◆在Windows3.X系统中,CONTROL.EXE发送的是CPL_INQUIRE消息。为向下兼容,该消息被保留。基于Win32的CPL应使用CPL_NEWINQUIRE。

        ◆通过判断lParam1的值,可对一个CPL支持的多个组件的图标、名称、提示内容等进行控制。

        5、控制面板显示所有查找到的组件图标。鼠标双击任一组件图标,控制面板向其CPL发送一条CPL_DBLCLK消息,CPL显示相应对话框,供用户改变系统设置。

        说明:

        ◆通过检测lParam1的值,可判断用户双击的是一个CPL支持的多个组件中的哪个图标,并运行相应程序。

        6、控制面板关闭时,向每个组件发送一条CPL_STOP消息,然后对每个CPL发送一条CPL_EXIT消息,CPL释放内存并卸载。

        三、控制面板组件编写实例

        1、编程步骤:

  • 在Delphi IDE中选取菜单File-New-DLL-OK。
  •     ②在Project1中添加如图所示Form1、Form2……,根据需要设计窗体界面。为简略起见,本文仅以Form1为例。

        ③Form1主要代码:(为编写基于Win32的CPL,本文以读写Windows注册表为例)

  • 在uses子句添加:Registry。//引用注册表单元
  • 在type部分声明变量:
  • var

    Form1: TForm1;

    KeyHandle : HKEY;

    ValSize : longint;

    Option1 : Integer;

    Option2 : Integer;

  • TForm1.FormActivate代码://打开Windows注册表,读取某特定键值
  • procedure TForm1.FormActivate(Sender: TObject);

    begin

    RegOpenKeyEx(HKEY_CURRENT_CONFIG,

    'Software\Microsoft\windows\CurrentVersion\',

    0, KEY_ALL_ACCESS, KeyHandle);

    ValSize := SizeOf(Option1);

    RegQueryValueEx(KeyHandle,'WinA', nil, nil, @Option1,

    @ValSize);

    ValSize := SizeOf(Option2);

    RegQueryValueEx(KeyHandle,'WinB', nil, nil, @Option2,

    @ValSize);

    with Form1 do begin

    case Option1 of

    0: RadioGroup1.ItemIndex:=0;

    1: Radiogroup1.ItemIndex:=1;

    2: Radiogroup1.ItemIndex:=2;

    3: Radiogroup1.ItemIndex:=3;

    end;

    case Option2 of

    0: Radiogroup2.ItemIndex:=0;

    1: Radiogroup2.ItemIndex:=1;

    2: Radiogroup2.ItemIndex:=2;

    3: Radiogroup2.ItemIndex:=3;

    end;

    end;

    end;

  • TForm1.CancelClick代码://关闭Form1,返回控制面板
  • procedure TForm1.CancelClick(Sender: TObject);

    begin

    close;

    end;

  • TForm1.ApplyClick代码://设置注册表键值
  • procedure TForm1.ApplyClick(Sender: TObject);

    begin

    with Form1 do begin

    Option1:=Radiogroup1.ItemIndex;

    Option2:=Radiogroup2.ItemIndex;

    end;

    RegSetValueEx(KeyHandle,'WinA', 0, REG_BINARY, @Option1, SizeOf(Option1));

    RegSetValueEx(KeyHandle,'WinB', 0, REG_BINARY, @Option2, SizeOf(Option2));

    end;

  • TForm1.FormClose代码://关闭注册表
  • procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);

    begin

    RegCloseKey(KeyHandle);

    end;

    ④修改Project1代码如下:

    library Project1;

     

    uses

    Cpl,

    Windows,

    Forms,

    Unit1 in 'Unit1.pas' {Form1},

    Unit2 in 'Unit2.pas' {Form2};

     

    {$R *.RES}

     

    procedure ExecuteApp;

    {$E dll}

    begin

    Application.Initialize;

    Application.CreateForm(TForm1, Form1);

    Application.Run;

    end;

     

    procedure ExecuteApp2;

    {$E dll}

    begin

    Application.Initialize;

    Application.CreateForm(TForm2, Form2);

    Application.Run;

    end;

     

    function CPlApplet(hwndCPl: THandle; uMsg: DWORD;

    lParam1, lParam2: LongInt):LongInt;stdcall;

    var

    NewCplInfo:PNewCplInfo;

    begin

    Result:=0;

    case uMsg of

    CPL_INIT:

    Result:=1;

    CPL_GETCOUNT:

    Result:=2;

    CPL_NEWINQUIRE:

    begin

    NewCplInfo:=PNewCplInfo(lParam2);

    with NewCplInfo^ do

    begin

    dwSize:=SizeOf(TNewCplInfo);

    dwFlags:=0;

    dwHelpContext:=0;

    lData:=0;

    if lParam1=0 then

    begin

    szName:='新的控制面板组件';

    hIcon:=LoadIcon(HInstance,'ICON');

    szInfo:='这是一个尝试';

    end

    else

    begin

    szName:='新的控制面板组件2';

    hIcon:=LoadIcon(HInstance,'ICON2');

    szInfo:='这是一个尝试2';

    end;

    szHelpFile:='';

    end;

    end;

    CPL_DBLCLK:

    begin

    if lParam1=0 then

    ExecuteApp

    else

    ExecuteApp2;

    end;

    else Result:=0;

    end;

    end;

     

    exports

    CPlApplet;

     

    begin

    end.

        ⑤选取菜单Project桹ptions桝pplication,在Target file extension中输入:DLL。在Load Icon中选择DLL图标。

        ⑥选取菜单Run桺arameters,在Host application中选择一主程序。例如:D:\PROGRAM FILES\BORLAND\DELPHI3\HELP\TOOLS\HCW.EXE.

        ⑦按F9运行程序,生成Project1.dll。

        ⑧将Project1.dll改名为Project1.cpl,存入C:\WINDOWS\SYSTEM\目录下。或者,在CONTROL.INI的[MMCPL]中添加:

    uniqueName=D:\PROJECT1.DLL(具体视DLL所在路径而定)

        ⑨启动控制面板,可以看到③中指定的图标(一个或多个)已出现在控制面板中,鼠标双击图标,弹出相应的Form1、Form2……。

    说明:

  • 编程时也可将有关参数存放在某一INI文件中,操作方法不再赘述。
  • 其它应用程序可通过操作INI文件或Windows注册表得到所需参数。
  •     ◆本文所述编写DLL方法同样适用于VC、BC、C++Builder等开发工具,但应注意语法、变量、函数原型等不同要求。

    以上程序在Delphi3.0/4.0、简体中文Windows 95/NT/98环境中调试通过。

                                                   一九九九年五月十日

      

    作者通信地址:(230031)安徽省合肥市炮兵学院研究生系97级 张建军(收)

    作者电话: 0551-5560324(张建军宿舍)

               0551-5562566转68750、68210(研究生系值班室)

    作者Email: davidhy@263.net

    相关文章:
  • 1 建筑材料课程教学方法的探讨
  • 2 行为导向教学法在中职机械加工教学中的应用
  • 3 任务引领教学法在中职电气控制技术教学中应用的探索
  • 4 中职汽修专业教学中趣味教学策略的积极融入
  • 5 行动导向教学法的实践研究
  • 6 项目教学法在中职网络营销教学中的应用研究
  • 7 项目教学法能有效提高职业中学的计算机教学质量
  • 8 关于新课程背景下高中数学有效教学方法的探索
  • 9 高职英语项目化教学改革中的问题及对策探讨
  • 10 食品营养与检测专业设置与锡林郭勒地区产业需求对接研
  • 现代职业教育杂志论文在线投稿
    刊物简介
      现代职业教育
    • CN :14-1381/G4
    • ISSN:2096-0603
    • 邮发代号:22-382
    • 邮箱投稿:xdzyjy@163.com

    • 国家新闻出版总署收录
    • 中国知网、万方数据—数字化期刊群
    • 龙源期刊网、维普数据库全文收录。
    期刊目录
    杂志动态
    最近更新