摘要:
对计算机的运行环境的配置有多种方法,而在WINDOWS 9X/NT中引入了一种新的方法,即控制面板。利用控制面板配置环境,方便直观。本文详细地介绍了控制面板程序的原理和编写方法,并给出了用Delphi4.0编写的一个实际例子。
关键字:
控制面板程序、动态链接库、消息处理、注册表
前言:
我们在编写软件时,有的时候需要用户对应用环境进行参数设置。常见的做法有编写一个安装程序,在安装过程中进行参数配置,或者在软件中提供一个专门的功能选项,用户在使用时可以利用这些功能选项来配置。这两种方法尤其是后者是一般软件中最常用的方法。在这里,向大家介绍一种新的方法:即利用控制面板程序(Control Panel applets)进行参数设置。我们都知道,在WINDOWS 9X/NT 中提供了控制面板,用户可以通过它很轻松地完成各种环境变量的设置,例如输入方法、ODBC等等。本文将用一个很简单的例子来说明如何在Delphi中实现控制面板程序。
1.控制面板程序
1.1CPlApplet
控制面板程序是一种特殊的动态链接库(DLL),首先,其扩展名与一般的动态链接库不同,不是.DLL而是为.cpl。其次,它的标准入口函数不是DllMain()而是CplApplet()。CplApplet接收从控制面板发来的消息并作出相应的反映。CPlApplet的函数原形如下:
function CPlApplet(
hwndCPl:HWND; //程序主窗口的句柄
uMsg:word; //发送到控制面板程序的消息
lParam1:Longint; //消息参数
lParam2:Longint //消息参数
):Longint
uMsg有如下几种形式:
消息
发生时刻
相应的处理方法
CPL_DBLCLK
用户双击了该程序对应的图标
显示程序的主界面
CPL_EXIT
CPL_STOP之后
释放所有资源
CPL_GETCOUNT
CPL_INIT后
返回程序中对话框的数目
CPL_INIT
程序被装入内存后
初始化工作
CPL_INQUIRE*
CPL_GETCOUNT后
设定某个特定窗口的性质
CPL_NEWINQUIRE
CPL_GETCOUNT后
设定某个特定窗口的性质
CPL_SELECT*
CPL_STOP
程序关闭之前
释放对话框资源
* 是与旧版本的Windows兼容,Windows 9X/NT 4.0不再使用。
1.2控制面板程序中的消息处理过程
CPlApplet函数处理发送到控制面板程序的所有消息。发送到控制面板程序的消息是按照一定的顺序进行的。
① 当程序被装入内存时,CPlApplet函数接收到CPL_INT消息。当接收到该消息后,CPlApplet函数应该作一些初始化的工作,例如分配内存等。如果初始化完成,应该返回非零,否则,返回零,这样程序将被终止。
② 如果CPL_INT被成功处理,CPlApplet函数将接收到CPL_GETCOUNT消息。CPlApplet必须返回对话框的数目。
③ 接着,CPlApplet接收到CPL_NEWINQUIRE消息。此时的lParam2是一个指向NEWCPL_INFO结构的指针。
Type
NEWCPL_INFO =Record
dwSize:Longword; //该结构的大小
dwFlags:Longword; //未用
dwHelpContext:Longword; //未用
lData:integer; //当消息为CPL_DBCLICK或CPL_STOP时,其为返回值
hIcon:HICON; //对话框的图标的句柄
szName:array[0..31] of char; //在控制面板中图标下的说明文字。
szInfo:array[0..63] of char; //在控制面板中状态行中的说明信息。
szHelpFile:array[0..127] of char; //未用
End;
接收到该消息后,CPlApplet必须填充该结构。指出其名称,提示信息、图标等。
④ 接着,CPlApplet接收到CPL_DBCLICK消息,在这里,一般是显示对话框以及处理用户的输入等。
⑤ 当用户关闭程序时,CPlApplet接收到CPL_STOP消息。此时应该释放分配的内存资源,若无,则可以忽略这一步。
⑥ 接着,CPlApplet接收到CPL_EXIT消息,Unregister各种窗口。
⑦ 最后,系统调用FreeLibrary将DLL(该控制面板程序)从内存中卸出。
一般情况下,我们只需处理CPL_DBCLICK和CPL_NEWINQUIRE即可。
2.一个简单的例子:
本例是一个CPL的演示程序,其作用在于为某个客户软件设置其Socket的通信端口。该端口值放在HKEY_LOCAL_MACHINE/Software/silicon/papers下的port中。通过该程序可以更改其端口号。
其源代码如下:
//mycpl.dpr的源代码
library mycpl;
uses
SysUtils, Classes, u_main in 'u_main.pas' {f_main};
{$E cpl}
exports
CPlApplet ;
begin
end.
//u_main.pas的源代码
unit u_main;
interface
uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
ComCtrls, ToolWin, StdCtrls, Buttons,registry;
type
Tf_main = class(TForm)
edPort: TEdit;
btnOk: TBitBtn;
btnCancel: TBitBtn;
Label1: TLabel;
procedure FormCreate(Sender: TObject);
procedure btnOkClick(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
type
NEWCPLINFO =record // ncpli
dwSize:Longword;
dwFlags:Longword;
dwHelpContext:Longword;
lData:integer;
hIcon:HICON;
szName:array[0..31] of char;
szInfo:array[0..63] of char;
szHelpFile:array[0..127] of char;
end;
type
PNEWCPLINFO=^NEWCPLINFO;
const CPL_INIT=1;
const CPL_GETCOUNT=2;
const CPL_INQUIRE=3;
const CPL_SELECT=4;
const CPL_DBLCLK=5;
const CPL_STOP=6;
const CPL_EXIT=7;
const CPL_NEWINQUIRE= 8;
var
f_main: Tf_main;
aa:TIcon;
RegF:TRegistry;
function CPlApplet(hwndCPl:HWND; uMsg:word;lParam1:Longint; lParam2:Longint):Longint ;stdcall;
function OnInquire(uAppNum:word; pInfo:PNEWCPLINFO):integer;stdcall;
function OnDblclk(hwndCPl:HWND;uAppNum:word;lData:integer):integer;stdcall;
implementation
{$R *.DFM}
{$R icon.res}
//处理各种消息
Function CPlApplet(hwndCPl:HWND; uMsg:word;lParam1:Longint; lParam2:Longint):Longint ;stdcall;
begin
case uMsg of
CPL_DBLCLK:
OnDblclk(hwndCPl, lParam1, lParam2);
CPL_EXIT:
result:=0;
CPL_GETCOUNT:
result:=1;
CPL_INIT:
result:=1;
CPL_NEWINQUIRE:
OnInquire(lParam1, PNEWCPLINFO(lParam2));
CPL_INQUIRE:
result:= 0; // not handled
CPL_SELECT:
result:=1;
CPL_STOP:
result:=1;
else
result:=0;
end;
result:=1;
end;
//填充NEWCPLINFO结构。
function OnInquire(uAppNum:word; pInfo:PNEWCPLINFO):integer;stdcall;
begin
with pInfo^ do
begin
dwSize:=sizeof(NEWCPLINFO);
dwFlags:=0;
dwHelpContext := 0;
lData := 0;
hIcon:=loadicon(hinstance,'I1');
szName:='MyDemo';
szInfo:='MyDemo 系统设置';
szHelpFile:='';
end;
result:=0;
end;
//显示对话框
function OnDblclk(hwndCPl:HWND;uAppNum:word;lData:integer):integer;stdcall;
var
f_main:TF_main;
begin
f_main:=TF_main.Create(application);
f_main.ShowModal;
result:=0;
end;
//将port的值从注册表中读出,写到Edit edPort中。
procedure Tf_main.FormCreate(Sender: TObject);
var
port:integer;
begin
aa:=ticon.Create;
aa.Handle :=loadicon(hinstance ,'I1');
if(aa.Handle =0) then showmessage('error icon');
icon:=aa;
RegF:=TRegistry.Create;
RegF.RootKey:=HKEY_LOCAL_MACHINE;
RegF.OpenKey('SOFTWARE/Silicon/papers',True);
Port:=0;
if regF.ValueExists ('port')=true then
port:=RegF.ReadInteger('port');
edPort.Text :=inttostr(port);
RegF.CloseKey;
RegF.Free ;
end;
//将port的值写回注册表
procedure Tf_main.btnOkClick(Sender: TObject);
begin
RegF:=TRegistry.Create;
RegF.RootKey:=HKEY_LOCAL_MACHINE;
RegF.OpenKey('SOFTWARE/Silicon/papers',True);
RegF.WriteInteger('port', strtoint(edPort.text));
RegF.CloseKey;
RegF.Free ;
end;
end.
说明:
① 其中 icon.res中包含了程序的图标,所以在程序中加入一句{$R icon.res}。
② {$E cpl}表示动态连接库的扩展名为cpl。
③ exports关键字后的表示输出的函数,只需输出CplApplet即可。
3.控制面板程序的安装:
在Delphi中选择project|bulid mycpl编译程序。Mycpl是该示例程序的名字。然后将mycpl.cpl拷贝到Windows目录下的System目录下即可(在Windows NT 下是System32)。然后选择|开始|设置控制面板即可看到结果。
双击MyDemo,将显示对话框:
该程序在Windows 95,Windows 98,Windows NT4.0下已测试通过。
相关推荐
基于51单片机的通讯聊天系统
通过编写51单片机通讯聊天程序,掌握51单片机的各个模块的知识点和运用C语言编写51单片机的能力。用51单片机与口袋开发板设计实现一个单片机与电脑串口助手实现通讯功能的程序。程序的主要功能如下: 1 OLED初始化显示Welcome to Bluetooth communication! 字符串。 2 程序开始时处于接收信息模式, 电脑串口助手发送信息时,将从初始化字符第一个开始显示,电脑串口助手发送信息后,蜂鸣器响铃2秒左右。 3 每次同时按下左右键时,可以轮流切换接收/发送信息模式 4 在发送信息模式时
Delphi 开发控制面板程序
一、关于控制面板程序 在Windows中提供了一个控制面板窗口,一个控制面板窗口就象Windows的控制中心。在窗口中有诸如 “系统”、“多媒体”图标,通过双击这些不同的图标,就可以打开不同的控制面板程序查看系统状况和对系统进行设置了。 如何在控制面板中添加自己的控制面板程序呢?首先来了解以下控制面板程序的原理。一个控制面板程序就是一个动态连接库(DLL)。在库文件中必须建立一个名称为
arcgis插件 批量出图 按地块批量出图工具(动态文本、动态节点坐标表)
arcgis插件 批量出图 按地块批量出图工具。
Delphi 实现卸载Windows应用程序(类似360软件管家-卸载程序)
摘要: 本文主要梳理的是实现卸载程序并等待卸载程序运行结束的方法,如果仅仅是调用卸载程序,相信难度也不大,但是我们需要等待卸载程序执行完毕,这就有些费脑筋了(是不是想到了360?没错,360也具有这个功能)。这套逻辑是最近项目需要自己研究出来的,可能存在不完善的地方,如果有路过的朋友可以指正,不胜感激! 正文: 很多人都知道获取应用程序的卸载命令很简单,都记录在注册表中,在win64系统下,
使用C#调用百度地图并实现坐标点的设置以及读取
使用C#调用百度地图申请百度地图密钥以及查看百度API程序实现功能:最终图利用webBrowser控件展示地图 申请百度地图密钥以及查看百度API 网址:http://lbsyun.baidu.com/apiconsole/key#/home 网址:http://lbsyun.baidu.com/jsdemo.htm#c1_3 程序实现功能: 1、输入网址那可以调用本地的html文件,也可以访问其他网站 2、输入坐标、添加坐标按钮,可以将坐标值传入html文件中,显示在经纬度的文本框中 3、定位按钮可以
PaddleOCR转ONNX模型实战:5分钟搞定中文OCR推理部署(附完整代码)
本文详细介绍了将PaddleOCR模型转换为ONNX格式并进行高效推理部署的完整实战方案。通过Paddle2ONNX工具实现模型转换,利用ONNX Runtime构建跨平台推理引擎,涵盖环境配置、模型优化、批量处理及多平台部署等关键步骤,显著提升中文OCR在边缘设备上的推理性能。
delphi 创建服务,安装与卸载服务
运行Delphi7,选择菜单File-->New-->Other--->Service Application.将生成个服务框架.将工程保存为ServiceDemo.dpr和Unit_Main.pas,然后回到主框架.我们注意到,Service有几个属性.其中以下几个是我们比较常用:(1)DisplayName:服务显示名称 //通常中文(2)Name:服务名称. 安装与...
2025东三省D题深圳杯数学建模实战解析:基于多模型融合的法医STR混合样本智能识别系统
本文深入解析了2025年东三省数学建模竞赛D题,即深圳杯赛题,聚焦于法医STR混合样本的智能识别挑战。文章系统阐述了构建一个基于多模型融合的智能识别系统的完整流程,涵盖贡献者人数判定、DNA贡献比例估计、个体基因型推断以及STR谱图去噪四大核心步骤。通过融合高斯混合模型、随机森林、非负矩阵分解、小波变换与深度学习等多种技术,并强调特征工程的重要性,为破解法医DNA混合样本分析这一行业难题提供了清晰的数学建模与AI实战思路。
不在控制面板中显示卸载项 Hide Add/Remove Panel Entry
Installation Designer->Media->Releases: 选择要设置的release项, 在右边的参数列表中 Hide Add/Remove Panel Entry(最后一项),设置为yes 转载于:https://www.cnblogs.com/guatai/articles/1279530.html...
从CD4051到现代模拟开关:40年芯片演进史与选型避坑指南
本文回顾了从CD4051到现代模拟开关的40年技术演进,详细对比了导通电阻、带宽等关键参数的显著提升。通过实际案例和选型矩阵,揭示现代模拟开关在精度、功耗和集成度方面的优势,并提供高精度测量、电池供电等场景的选型策略与避坑指南,帮助工程师优化设计。
企业微信API实战:解密external_userid的跨应用一致性管理
本文深入探讨企业微信API中external_userid的跨应用一致性管理问题,解析其本质及在不同应用场景下的ID不一致挑战。通过ID转换与统一管理方案,结合unionid实现跨应用客户数据整合,提供实战代码示例和架构设计,助力企业构建高效的客户管理系统。
DELPHI利用WMI获取主板参数
WMI-Win32_baseboard 主板参数 Caption --简述 ConfigOptions --数组,表示位于在底板上跳线和开关的配置。 CreationClassName --表示类的名称(就是Win32_baseboard类) Depth --以英寸为单位的物理封装。 Description --对象的描述(底板) Height --用英寸表示的物理包的高度 HostingBoard --如果为TRUE,该卡是一个主板,或在一个机箱中的基板。 HotSwappable --如果为TRUE,就
VB摄像头监控
该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制
控制面板的小应用程序
控制面板的小应用程序 东北大学 张春明 张春丽 姜绍飞 01-4-23 上午 11:35:13 在Windows操作
ssm框架搭建
这个是一个在idea上成功跑起来的ssm框架项目,保存在这里方便以后使用直接下载
精雕软件(JDpaint) 5.5 绿色版
精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版
程序快捷方式/程序删除项/EXE自删除DIY
每一个编程爱好者,都希望自己的作品能为大家接受和喜爱,但我们的作品大多是简单的一个EXE文件的拷贝,既不需安装也没有删除程序,让人觉得只是程序而不是产品,以下我以Delphi 为例和大家交流一下程序组快捷方式建立、添加删除程序组中的删除项和程序的自删除等功能。1.以下先来介绍建立程序组快捷方式的方法:在uses 单元中加入 shlobj,activex,comobj,在窗口中添加一个butt
SIMATIC S7-1200, S7-1500 PID 控制[手册]
SIMATIC S7-1200, S7-1500 PID 控制[手册]
[原创]Delphi编程之Win10桌面图标设置
具体代码如下: unit Unit1; interface uses Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics, Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.ComCtrls,...
利用Dephi5编写控制面板程序 (转)
利用Dephi5编写控制面板程序 (转)[@more@]利用Dephi5编写控制面板程序 www.applevb.com 在windows中提供了一个控制面板窗口,一个控制面板窗口就象Windows的控制中心。在窗口中...
利用Dephi5编写控制面板程序
<!--google_ad_client = "pub-2947489232296736";/* 728x15, 创建于 08-4-23MSDN */google_ad_slot = "3624277373";google_ad_width = 728;google_ad_height = 15;//--><script type="text/javascript"
在Delphi程序中调用控制面板设置功能
====================================================== 注:本文源代码点此下载 ====================================================== 如果你有这个方面的问题请到delphi去提问或发表你的意见 来源:论坛转载无法确定出处,如有版权问题请与我们联系 在delphi程序中调用控制
用Delphi编写Win2000服务程序
用Delphi编写Win2000服务程序 摘要:本文介绍用Delphi编写Win2000服务程序,所涉及到的类是TServiceApplicatoin,TService,TServiceThread等。 关键字: Service/服务 一、Win2000服务简介服务程序(Service Application)是一种运行于WinNT的后台程序,每个服务程序(Ser
用delphi7编写windows服务程序总结
本来是没有打算把软件写成服务形式的。起因是因为,我原来写的一个TCP通讯程序的客户端,客户在使用时,因为经常断电,所以服务器有时候会重启,因为原来的程序不是服务形式的,在没有登陆windows界面的情况下,不能够自动运行。因此,才决定把现有的程序改为服务形式。 一、服务程序的创建 delphi编写服务程序非常简单,点击菜单 File->New->
程序中调用控制面板设置功能
应用程序运行时,有时需要对系统环境有特殊要求。例如,在Delphi数据库应用程序中可能需要进行BDE(Borland Database Engine)或ODBC数据源名称(DSN:Data Source Name)的设置;在网络应用程序中可能需要进行网络配置设置、Modem属性设置或用户拨号连接的帐号和密码的设置并保存在系统中;在CTI(Computer-Telephony Integrati
Delphi编写Windows系统服务程序【转帖】
Windows NT服务程序不同于一般的运行程序,它不需要NT登录进去,只需要开机进入NT系统便可以运行,一般用于系统服务方面的应用,学会编写NT服务程序对网络管理人员而言是非常重要的,Delphi4.0作为一种高效、快速、强大的开发语言,为开发NT服务程序提供了非常便捷的方法,加上其可视化界面以及与数据库的完美结合,使我们开发与数据库有关的NT服务程序变得非常简单,下面以编写一个NT定期备份程
利用Delphi编写屏幕保护程序
====================================================== 注:本文源代码点此下载 ====================================================== ----实际上windows的屏幕保护程序也是一个可执行文件,只不过扩展名是.scr而不是.exe。但是它也应满足一定的要求,以便提供给控制面板合
控制面板的编程
大家应该都非常熟悉控制面板吧,大家也都有操作过控制面板吧,但如何使用Delphi对控制面板进行编程呢?一、控制面板的原理下面我就来讲讲控制面板的原理:控制面板在windows中的system目录下,其中所有以CPL为扩展名的,就都是我们的控制面板。要想对控制面板进行编程,就要对CPlApplet这个函数非常熟悉,它是构成CPL文件的核心,原型如下:function CPlApptet(hwndCP
3637



被折叠的 条评论
为什么被折叠?



