控制面板小程序框架






4.76/5 (10投票s)
一个用于编写控制面板小程序(applet)的迷你框架。只需填空即可!
问题所在
Windows 控制面板是允许用户修改后台运行或自动运行的应用程序设置的理想方式。当我探索 NT 服务时,我认为使用控制面板小程序来控制我的服务是一个好主意。但是,控制面板小程序究竟是什么?如何编写一个呢?好吧,经过在 MSDN 上的一些探索,我发现控制面板小程序只是具有特定入口点和 .cpl 扩展名的标准 DLL。将这样的文件放在 Windows 系统目录中,下次启动控制面板时,您的自定义小程序就会出现。在我发现所需信息后,我开始编写一个控制面板小程序,完成后,我将大部分代码转化为一个迷你小程序框架,这样我就不必再写一遍了!
控制面板小程序的结构
控制面板小程序已经相当老了,毫无疑问,不久的将来它们会被功能齐全的 COM 对象取代。在此期间,它们是组件化编程的合理尝试。控制面板小程序是一个 DLL,它向控制面板应用程序提供一个标准接口。当控制面板启动时,它会查找 Windows 系统目录中的所有 .cpl 文件,并尝试将它们加载为 DLL。如果成功,它会尝试在新加载的 DLL 中找到一个名为 CPlApplet()
的函数。如果 DLL 具有此函数入口点,那么它就是一个控制面板小程序!但还有更多,一个 DLL 可以包含多个小程序,它们在控制面板中显示为独立的图标。
CPlApplet()
是一个相对简单的函数,它接收窗口句柄、消息和几个特定于消息的参数。编写它类似于编写正常的窗口过程,并且在 MSDN 和 VC++ 在线帮助中有相当详细的文档。我创建的框架提供了 CPlApplet()
的实现,以及一个 DllMain()
,并将这些 DLL 入口点连接到一个旨在作为小程序基类的类。只需从 CJBControlPanelApplet
派生,构建一个带有 .cpl 扩展名的 DLL,并与框架链接即可完成!
CJBControlPanelApplet 提供什么?
要成为一个控制面板小程序,您的 CPlApplet()
入口点必须对控制面板应用程序的消息做出适当的响应。其中大多数消息都是平凡的、用于维护的。CJBControlPanelApplet
会为您处理所有这些,并提供可以覆盖的虚拟函数,以便您可以获得更多控制。如果您愿意,只需要处理一个消息,通过提供一个 OnDoubleClick()
处理程序来响应小程序被激活时应该执行的操作。标准 CPL_ 消息中的每一个都有一个对应的虚拟消息处理程序(除了 CPL_GETCOUNT
,它完全由框架处理)。
您的派生类
要实现您的控制面板小程序,您需要执行以下操作:
- 包含 "ControlApplet.hpp",并从
CJBControlPanelApplet
公开派生一个类。 - 调用
CJBControlPanelApplet
构造函数,并传递小程序图标、名称和描述的资源 ID。 - 实现纯虚函数
OnDoubleClick()
- 这是您的小程序变得活跃并可以显示对话框或其他内容的地方。 - 在全局范围内创建一个您的应用程序类的实例。
- 链接 ControlApplet.cpp 并将 ControlApplet.def 包含到您的项目中。ControlApplet.cpp 提供了
CJBControlPanelApplet
的实现以及合适的DllMain()
和CPlApplet()
DLL 入口点函数。
如果愿意,您还可以
- 处理
OnInit()
- 用于资源获取或启动代码。 - 处理
OnStop()
- 用于资源释放和关机代码。 - 处理
OnExit()
- 用于在OnStop()
中因某种原因未完成的最后关机代码。 - 处理
OnInquire()
- 如果您真的想自己填充LPCPLINFO
结构。或者,您可能希望使用标准的OnNewInquire()
功能,因此您可能希望从此函数返回 FALSE! - 处理
OnNewInquire()
- 如果我处理它的方式不适合您。例如,用于动态图标或描述? - 处理
OnStartWithParams()
- 如果您想在通过 rundll 使用命令行参数启动时做一些巧妙的事情。
请注意,对于文档不完善的 CPL_STARTWPARAMS
的处理尚未经过测试,因为我无法访问 Windows 95,并且 rundll 在 NT4 上似乎不存在。
一个 DLL 中的多个小程序
CJBControlPanelApplet
实现了一个所有活动对象实例的链表。每次调用构造函数时,它都会将当前对象链接到所有 CJBControlPanelApplet
对象的静态列表中。每当 DLL 入口点处理消息时,它都会遍历小程序的静态列表,并将消息依次传递给每个小程序。您所需要做的就是在全局范围内声明一个从 CJBControlPanelApplet
派生的类型的对象,一旦小程序被加载,您的对象就会被创建并自动连接到列表,开始接收消息。
如果您想将多个小程序开发为独立的 DLL,那没问题;如果您改变主意,想将它们全部放在同一个 DLL 中,只需将所有文件链接到一个项目中,框架就会为您处理其余的事情。无需更改代码!
有关最新更新,请参阅 Len 主页上的 文章。