控制面板的小应用程序

转载 2007年09月11日 22:10:00

控制面板的小应用程序


东北大学 张春明 张春丽 姜绍飞
01-4-23 上午 11:35:13


在Windows操作系统中,控制面板中的“显示”、“系统”、“网络”、“字体”、“键盘”和“鼠标”等操作选项都是各自独立的应用程序,它们分别对应于Windows/System文件夹下扩展名为CPL的特殊动态链接库程序。我们称这些程序为控制面板小应用程序(Control Panel Applet),它们为用户设置软、硬件提供了许多方便。其实,这些控制面板小应用程序的编程并不复杂,我们完全可以自己编写。本文以Delphi语言为例,介绍如何自己编写控制面板小应用程序。
虽然我们可以直接创建一个扩展名为CPL的DLL动态链接库工程,但由于DLL工程调试起来相当麻烦,因此笔者建议首先创建一个EXE标准应用程序工程,然后当程序调试无误后再将其转换为控制面板小应用程序。
步骤一:
将工程文件首行的program改为library,即把“program mycpl;”语句改为:
library mycpl;
步骤二:
将工程文件中begin到end之间的所有程序代码(包括创建窗体以及运行应用程序等代码)移至一个自己创建的子程序中。
procedure RunApp;
begin
Application.Initialize;
Application.CreateForm(TForm1, Form1);
Application.Run;
end;
这样,就可以在CPL工程中随时调用该子程序,来实现应用程序原有的全部功能。
注意:上述方法比较适合于编写CPL,但不适合用于编写普通的DLL,因为在关闭DLL主窗口的同时,也将自动退出调用该DLL的应用程序。
步骤三:
在工程文件的uses语句中加入对Windows和CPL两个单元的引用。
步骤四:
在工程文件中加入{$E cpl}语句,即把动态链接库文件的扩展名设置为CPL。然后将Project Options对话框中Output Directory一项设置为Windows/system。这样一来,Delphi会自动将编译生成的CPL文件拷贝到Windows/System文件夹下。
步骤五:
编写一个名为CPLApplet的标准回调函数,作为CPL文件的入口函数。控制面板程序(即CONTROL.EXE)通过向该入口函数发送消息来与小应用程序对话。如,发送CPL_INIT消息来确定该CPL文件是否是小应用程序;发送CPL_GETCOUNT消息来确定该CPL文件包含多少个小应用程序(注:每个CPL文件可以包含多个小应用程序)等等。
下面是在CPL.PAS单元文件中被声明且可以由CPLApplet回调函数处理的所有消息的说明。
1.CPL_DYNAMIC_RES消息(值为0)
控制面板程序通过CPLInfo数据结构的idIcon, idName或idInfo字段来获得资源ID,并将对应的资源存储到一个缓冲区,以后就直接从缓冲区中读取,而不再从资源中读取。而CPL_DYNAMIC_RES消息用于通知控制面板程序不要缓存上述资源,即每次都必须重新读取资源。这样一来,小应用程序就可以动态实时地改变图标说明等信息,常用于显示设备当前的状态等场合。但这种方法比从缓冲区中读取资源的速度要慢得多。
2.CPL_INIT消息(值为1)
控制面板程序向小应用程序发送该消息,以确定它是否为小应用程序。若返回TRUE,则表明它是小应用程序,然后可以继续向它发送其他消息,否则立即终止发送消息。
3.CPL_GETCOUNT消息(值为2)
控制面板程序向小应用程序发送该消息,以返回该CPL包含的小应用程序数目,即显示在控制面板窗口中的图标数目。
4.CPL_INQUIRE消息(值为3)
控制面板程序向小应用程序发送该消息,以获得每个小应用程序的信息。其中lParam1为小应用程序编号(起始编号为0),lParam2参数为指向CPLInfo数据结构的远指针。在CPL_Info结构的idIcon, idName, idInfo和lData字段中分别填充待显示的图标、名称、说明和自定义数据的资源标识符。
5.CPL_SELECT消息(值为4)
当用户单击小应用程序图标时向小应用程序发送该消息。lParam1参数为对应的小应用程序编号,lParam2参数指向自定义的lData。
6.CPL_DBLCLK消息(值为5)
当用户双击小应用程序图标时向小应用程序发送该消息。lParam1参数为对应的小应用程序编号,lParam2参数指向自定义的lData。小应用程序可以打开一个对话框作为响应。
7.CPL_STOP消息(值为6)
控制面板程序在结束运行之前向每个小应用程序发送该消息。其中lParam1参数为小应用程序编号,lParam2参数指向lData。与小应用程序相关的清理工作必须在这个期间内完成。
8.CPL_EXIT消息(值为7)
控制面板程序在调用FreeLibrary函数之前向小应用程序发送该消息。此时可以做一些与小应用程序无关的清理工作。
9.CPL_NEWINQUIRE消息(值为8)
该消息与CPL_INQUIRE消息类似。区别在于lParam2参数指向一个NewCPLInfo数据结构。若应用程序响应了该消息,则控制面板程序将不再发送CPL_INQUIRE消息。
10.CPL_STARTWPARMS消息(值为9)
当通过RUNDLL命令启动小应用程序时发送该消息,且可以包含很多附加指令。其中lParam1参数为小应用程序编号,lParam2参数为指向附加指令字符串的一个长指针。若消息被处理,则返回TRUE,否则返回FALSE。与CPL_DBLCLK消息一样,小应用程序此时可以打开一个对话框作为响应。
11.CPL_SETUP消息(值为200)
该消息供控制面板程序内部使用。仅在系统安装过程中从命令行启动时才发送该消息。
综上所述,CPLApplet回调函数看似复杂,实则不然。下面是一个典型例子的代码:
function CPLApplet(hwndCPl: THandle; uMsg:
DWORD;lParam1, lParam2: LongInt): LongInt; stdcall;
var
NewCPLInfo: PNewCPLInfo;
begin
{ 设置默认的返回值 }
Result:=0;
case uMsg of
{控制面板程序发送该消息进行初始化。若返回1,则表示为一个小应用程序 }
CPL_INIT:
Result := 1;
{控制面板程序发送该消息来获得该CPL文件包含的小应用程序的数目 }
CPL_GETCOUNT:
Result := 1;
{控制面板程序对每个小应用程序均发送该消息,以显示图标、名称和说明 }
CPL_NEWINQUIRE:
begin
NewCPLInfo := PNewCPLInfo(lParam2);
with NewCPLInfo^ do
begin
{ 设置数据结构的大小(以字节计) }
dwSize := SizeOf(TNewCPLInfo);
{ 设置标志位 }
dwFlags := 0;
{ 设置帮助上下文 }
dwHelpContext := 0;
{ 设置用户自定义数据指针 }
lData := 0;
{ 设置小应用程序的图标}
hIcon:=LoadIcon(hInstance,‘MAINICON’);
{ 设置显示在图标下面的小应用程序名称 }
szName :=‘我的小应用’;
{ 设置显示在控制面板窗口状态栏的文字 }
szInfo := ‘小应用程序测试’;
{ 设置帮助文件 }
szHelpFile :=‘’;
end;
end;
{ 当用户双击小应用程序图标时发送该消息,编程者可以自行确定要执行的代码 }
CPL_DBLCLK:
begin
RunApp;
end;
end;
end;
对于32位应用程序而言,CPLApplet函数后面不必加export编译指令。
步骤六:
在工程文件的exports语句中输出CPLApplet回调函数。
exports
CPLApplet;
begin
end;
通过以上6步,即可实现一个控制面板小应用程序的设计。
 

Java小应用程序

Java小应用程序:Java程序可以嵌入到网页中运行的Java程序 Java小应用程序中没有main方法,所有的小应用程序都是javax.swing.JApplet类或者它的超类(Java.appl...
  • hry1243916844
  • hry1243916844
  • 2017年05月06日 11:12
  • 866

一个简单的java小应用程序

package hu; import java.applet.*; import java.awt.*; public class Boy extends Applet { /** * ...
  • lihongxuanli
  • lihongxuanli
  • 2012年11月07日 19:45
  • 1435

用eclipse怎么运行Java小应用程序

1.编写代码 2.保存(默认自动编译) 3.运行 运行方法一:在代码上单击右键,选择Run As --> Java Application 运行方法二:在左侧包视图中选中包含main的类,右键 Run...
  • cos_sin_tan
  • cos_sin_tan
  • 2012年02月11日 15:52
  • 1016

用命令启动控制面板

 内容分类: 背景知识 关键词: 控制面板;命令行    当无法用常规方法打开控制面板中的项目时,可用命令方式打开。   启动控制面板命令大全控制面板模块: control.exe命令: rundll...
  • shaopang
  • shaopang
  • 2006年07月05日 16:58
  • 944

小应用程序

相对于应用程序,小应用程序不能独立运行,需要嵌入Web页面中,或者在支持Java虚拟机的浏览器上运行。这里也给出Hello World的实例,使用的是小应用程序。这个程序在网页中坐标(10,100)的...
  • yubinbin19881234
  • yubinbin19881234
  • 2008年10月13日 23:59
  • 217

win2003控制面板不见了,打开“控制面板”的方法,安全策略

在win2003上安装了一个软件,结果后来要卸载掉,发现控制面板不见了。 右键我的电脑/管理,被提示没有权限?! 肯定是安全策略的问题。 在网络上搜索了一下,自己整理解决方法如下: 百度知道:打开“控...
  • apensu
  • apensu
  • 2010年02月04日 22:28
  • 5239

appletviewer

appletviewer 的运行   很多java的初学者都遇到这个问题   AppletViewer是jdk工具,位于jdk安装路径/bin中   使用方法与java.exe一样 ...
  • auspark
  • auspark
  • 2012年05月28日 12:46
  • 770

删除控制面板里面的java

在注册表删除 win开始菜单->运行->regedit 然后找到,并删掉 HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Ex...
  • chen136428
  • chen136428
  • 2015年01月09日 10:56
  • 969

Client程序向服务器主机的端口4441提出请求,连接建立后完成对服务器的读写

【例 13-3】C/S模式中的Client端应用程序。这是一个Client端的流式Socket通信的简单实例,代码说明Client端程序的编写方法。例中,Client程序向服务器主机的端口4441提出...
  • qq_27073205
  • qq_27073205
  • 2015年05月20日 18:34
  • 366

使用控制面板修复OFFICE程序

这个提示有可能是因为需要重新激活了 win7下 开始—程序—控制面板—删除和添加程序—OFFICE2003—更改  会弹出一个框,选择重新输入激活码 如是自己装的Office 2010 Pro...
  • baidu_18607183
  • baidu_18607183
  • 2016年06月21日 11:09
  • 2204
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:控制面板的小应用程序
举报原因:
原因补充:

(最多只允许输入30个字)