|
控制面板,你了解多少。当你安装了一些应用程序后,是否感觉到你的控制面板增加了一些组件,如安装了Borland C++ Builder后,“BDE Administrator”就会进入你的控制面板,安装了QuickTime还会增加“QuickTime”组件,这些现象说明了什么,我想它只是说明了一个事实:“控制面板”是可以操纵的,你也可以控制你的控制面板,它并无什么神秘可言,哪到底如何操纵呢,这正是我今天要讨论的主题,在这里我将会带领大家有浅入深地来探讨“控制面板”这个鲜为人知的主题。我主要分3个部分来阐述:(由于文章大小的限制,我决定将其分成两章来介绍) 1、控制面板是什么,它在哪里? 2、CPL文件的真实身份 3、VCL如何提供对“控制面板”的支持
控制面板是什么,它在哪里? 控制面板是什么,它在哪儿? 以前,我也很困惑,只是偶尔从一些关于“Windows系统管理”的书籍朦胧地听到关于“控制面板”的描述:“控制面板的每一项一般都会对应一个.CPL文件,这些文件存于系统目录下,你可以指定控制面板中要显示的项目,也可以隐藏等等”关于如何实现,可能还会教给你一些通过修改注册表来达到目的,是的,这可以达到目的,但我想这只是从一个管理者地角度来看待这个问题的,如果从程序员的角度又如何的,他们的描述能解决你的问题吗?你如何利用程序来达到控制你”控制面板”的目的,你想知道吗,请听下文分解. CPL文件的真实身份 上面提到了以“.CPL”扩展名结尾文件”,既然又与控制面板有关,哪我就来分析一下CPL文件到底是什么吧,随便找一些CPL文件,如:main.cpl,access.cpl等,我用Dumpbin测试结果如下: CWINDOWSsystem32dumpbin main.cpl Microsoft (R) COFF Binary File Dumper Version 6.00.8168 Copyright (C) Microsoft Corp 1992-1998. All rights reserved. Dump of file main.cpl File Type DLL(由DLL可以知道它是一个DLL文件) CWINDOWSsystem32dumpbin exports appwiz .cpl Microsoft (R) COFF Binary File Dumper Version 6.00.8168 Copyright (C) Microsoft Corp 1992-1998. All rights reserved. Dump of file appwiz.cpl File Type DLL Section contains the following exports for appwiz.dll ordinal hint RVA name 1 0 00017926 CPlApplet 2 1 00017F05 ConfigStartMenu ...... CWINDOWSsystem32dumpbin exports access.cpl Microsoft (R) COFF Binary File Dumper Version 6.00.8168 Copyright (C) Microsoft Corp 1992-1998. All rights reserved. Dump of file access.cpl
File Type DLL Section contains the following exports for Access.dll ordinal hint RVA name 1 0 00004B41 CPlApplet
2 1 00004B33 DebugMain 3 2 00004B30 DllRegisterServer 3 3 00004A27 DllUnregisterServer
从上面的测试结果你看到了什么,我认为至少有两点: 1、 CPL文件就是一个DLL文件 2、 CPL文件都导出了一个CPLApplet函数 这两点揭开了控制面板程序的神秘面纱,你不会再对控制面板程序是什么感到疑惑了,其实,控制面板程序就是一个须导出CPLApplet函数的DLL文件,只是挂上了CPL的后缀名而已。既然都要导出CPLApplet函数,可以想象CPLApplet这个函数的重要性,其实,不光是控制面板,只要是想加载CPL文件的其他所有应用程序都必须取得CPLApplet函数的地址然后通过调用该函数来完成相应得功能的,以下是我从MSDN得来的关于它的声明,详细信息请参考MSDN. LONG APIENTRY CPlApplet( HWND hwndCPl, UINT uMsg, LONG lParam1, LONG lParam2 ); 参数的意义 hwndCPl 激活控制面板组件应用程序的窗口句柄 uMsg 外界传入的控制消息,CPLApplet函数就是通过该消息去完成 相应的任务的 lParam1 消息参数1 lParam2 消息参数2 CPLApplet函数可以接受的控制消息一览表: 消息 描述 ━━━━━━━━━━━━━━━ CPL_INIT CPL程序收到的第一个消息,在这儿通常完成控制面板组件数据及变量的初始化工作 CPL_GETCOUNT CPLApplet函数在继CPL_INIT消息之后收到的第二个消息,它使得CPLApplet函数返回该CPL文件所包含的控制面板组件数目 CPL_INQUIRE CPL_INQUIRE及下一个要介绍的CPL_NEWINQUIRE消息是所有控制面板程序的消息中最重要的两个消息,可以这样说控制面板就是利用这两个消息来取得每个组件的名称、描述及图标等信息。CPL_INQUIRE会将组件信息填入TCPLInfo的结构中,TCPLInfo结构的声明如下: typedef struct tagCPLINFO { int idIcon; int idName; int idInfo; LONG lData; } CPLINFO; typedef tagCPLINFO TCPLInfo; 然后你的程序就可以利用LoadString,LoadIcon(这个API 函数已被LoadImage函数取代,不过你还是可以用)等API 函数来取得相应的信息 CPL_NEWINQUIRE CPL_NEWINQUIRE与CPL_INQUIRE消息所完成的功能差不多,但它会将组件信息填入TNewCPLInfo结构而不是TCPLInfo结构中,一看名称就知CPL_NEWINQUIRE较CPL_INQUIRE后出来,按照常规的思维一般应优先选择后出来得的即使用CPL_NEWINQUIRE,但这是一个例外,TNewCPLInfo结构虽较TCPLInfo更为完整,但它所包含的资料无法缓存,所以使用TNewCPLInfo会使开启控制面板的速度减慢,这也是微软文件上注明着”除非必要,否则请尽量以CPL_INQUIRE消息来传递组件信息”的原因 CPL_DBLCLK 当用户双击控制面板中组件的图标时就会触发CPL_DBLCLK消息来相应用户的操作,一般是开启一个对话框来供用户进行调整设定,如:”Internet 选项” 就会显示一个有关IE设置的对话框,你可以在该对话框中设置IE的一些属性 CPL_STOP 这个消息主要是提供机会给你进行善后工作的,如释放与组件相关的内存.
作者:ZQGet
|