windows控制面板消息处理流程

前言
在windows操作系统中,常用的设置功能都是放在控制面板中,当然,除了微软自己的应用外,还会有第三方公司的设置程序,比较显示驱动等产商也会加入一些自己的设定程序。如果我们自己也想加入这个功能的话,是否可行,该如何来做呢?
原理剖析
当我们打开控制面板的链接时,windows会给系统目录下的*.cpl文件发生消息以进行确认,当*.cpl文件返回相应的结果时,控制面板会将这些cpl以链接的形式加入到控制面板上。
控制面板的WINDOWS消息
CPL_INIT: WINDOWS送的第一个消息,cpl如果给于处理的话,返值值不为0,则发送下一消息。
CPL_GETCOUNT:系统会于确认该cpl所实现控制面板组件数目,若为0,则不进行显示
CPL_INQUIRE: 获取在控制面板中显示的一些属性,如显示名称,图标,描述,注意返回的数值,具体的内容要去资源文件中获取。若cpl返回回去的值有0(代表动态的),即控制面板会以CPL_NEWINQUIRE得到的值为准。若均为非0值,则系统会将这些内容进行缓存。
CPL_NEWINQUIRE: 功能同CPL_INQUIRE,但结果不会缓存。
CPL_DBLCLK:双击控制面板中显示的图标时发出。也就是CPL所实现的功能操作部分
CPL_STOP:CPL_DBLCLK执行结束后送出。一般可以做一些资源的清理工作。
CPL_EXIT:CPL_STOP送出,可以做一些资源的清理工作。
 消息的发送解析
在CP_INQUIRE返加的结构均为非零的时候,因系统会进行缓存,所以执行的流程如下
初次打开控制面板CPL_INIT -> CPL_GETCOUNT->CPL_INQUIRE->CPL_NEWINQUIRE-> 初次离开控制面板 CPL_STOP->CPL_EXIT
因为缓存的关系,后续再打开控制面板,就不会进行这些消息的发送了。
双击控制面板图标时的消息发送
CPL_INIT->CPL_GETCOUNT->CPL_INQUIRE->CPL_NEWINQUIRE->CPL_DBLCLK->CPL_STOP->CPL_EXIT
测试代码
library CPLTestNative;

uses
  SysUtils, windows,
  Classes,
  CPL;
procedure MsgBox(sMsg:string);
begin
  MessageBox(0, PChar(sMsg), 'Hello, control panel', MB_ICONINFORMATION);
end;

{$R CPLNative.res}
function CPlApplet(hwndCPL: HWND; uMsg: UINT; lParam1: LPARAM;
  lParam2: LPARAM): LongInt; stdcall;
var
  pInfo: PCPLInfo;
begin
  case uMsg of
    CPL_INIT:
    begin
      MsgBox('get CPL_INIT');
      Result := 1;
    end;
    CPL_GETCOUNT:
    begin
      MsgBox('get CPL_GETCOUNT');
      Result :=1 ;
    end;
    CPL_INQUIRE:
    begin
      Msgbox('get CPL_INQIRE');
      pInfo := PCPLInfo(lParam2);
      with pInfo^ do
      begin
        idName := 1;
        idInfo := 2;
        idIcon := 5;
        lData  := 0;
      end;
      Result := 0;
    end;
    CPL_NEWINQUIRE:
    begin
      MsgBox('get NEWINQUIRE');
      Result := 0;
    end;
    CPL_DBLCLK:
    begin
      MsgBox('get CPL_DBLCLK');
      MsgBox('I''m the smallest applet application');
      Result := 0;
    end;
    CPL_STOP:
    begin
      MsgBox('get CPL_STOP');
      Result := 0;
    end;
    CPL_EXIT:
    begin
      MsgBox('get CPL_EXIT');
      Result := 0;
    end;
  end;
end;
exports
  CPlApplet;
begin
end.

来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/68137/viewspace-692010/,如需转载,请注明出处,否则将追究法律责任。

转载于:http://blog.itpub.net/68137/viewspace-692010/

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值