Hacer un Applet de panel de control (CPL)  

Enviado Por: Radikal (Q3 Team)
Web : http://www.q3.nu
Email: radikal@q3.nu
Fecha: 16/01/00

Truco accedido 122 veces

 


Si queremos situar un icono en el Panel de Control de Windows, necesitaremos construir un applet CPL.
Un applet CPL no es más que una DLL renombrada a CPL y que además interactua con el Panel de Control mediante una función llamada CPlApplet.
Es decir: Tendremos que hacernos una DLL, y exportar una función con dicho nombre.
Además de esto, la función será llamada por el Panel de Control cuando él crea necesario, procudiendose así un diálogo entre nuestro applet y el Panel de Control.

Veamos que pinta han de tener los parámetros de esta función que debemos exportar:


 function CPlApplet(hwndCPl: THandle; uMsg: DWORD;
                  lParam1, lParam2: LongInt):LongInt;stdcall;




El Panel de Control, invocará nuestra función CPlApplet ante determinados eventos ocurridos con nuestro applet.
Estos eventos, los discriminaremos mediante el parámetro uMsg, que puede tener alguno de estos valores:


CPL_INIT


El Panel de Control enviará este mensaje para interrogar a nuestro CPL, con el fin de averiguar si efectivamente se trata de un Applet. Deberemos devolver un 1 (TRUE), para que todo vaya bien.


CPL_GETCOUNT


Aqui se nos pregunta por el número de applets que contiene nuestro CPL. Le diremos que 1.


CPL_INQUIRE


Aqui se nos pregunta por los datos acerca de cada icono a mostrar en el panel de control (icono, nombre, descripcion, etc).


CPL_DBLCLK


Se nos enviará cuando el usuario haya hecho doble click sobre nuestro icono.
This parameter will be sent when the user has made double click on our icon.

NOTA: Un CPL puede 'contener' varios iconos, y sería funcion nuestra discriminar cual ha sido pulsado. Para no liarnos, en este truco haremos un ejemplo con un sólo icono...



Un ejemplo del que partir:
Haremos una aplicacion con una form, la convertiremos en una DLL, añadiremos una funcion CPlApplet que responda adecuadamente al Panel de Control, renombraremos la DLL a CPL y la copiaremos en el directorio de sistema (Windows/System).
Vayamos por partes:

  • Create una nueva aplicacion con una form.
  • Ahora, activa la vista del fuente del proyecto (View - Project Source)
  • Añade dos units en la claúsula uses del projecto: Cpl y Windows. Te quedará algo así:



     uses
       Forms,
       Cpl,
       Windows,
       Unit1 in 'Unit1.pas' {Form1};
    



  • Ahora, como se trata de convertir nuestra aplicacion en una DLL, haremos una función que se encargará de arrancar nuestra aplicación cuando sea necesario. Se trata de meter en una función el código que hay en el projecto, entre el begin y el end. Por ejemplo:


     procedure ExecuteApp;
      begin
       Application.Initialize;
       Application.CreateForm(TForm1, Form1);
       Application.Run;
     end;
    



  • Ahora, colocamos nuestra función CPL, sin olvidarnos de exportarla para que el Panel de Control la pueda ejecutar.
  • Por ultimo, cambiamos la directiva 'Project' por 'Library', para convertir nuestra aplicacion en una DLL
  • Tras hacer todo esto, el fuente del proyecto tendrá un aspecto parecido a este:


     library Project1;
    
     uses
       Forms,
       Cpl,
       Windows,
       Unit1 in 'Unit1.pas' {Form1};
    
     {$R *.RES}
    
     procedure ExecuteApp;
      begin
       Application.Initialize;
       Application.CreateForm(TForm1, Form1);
       Application.Run;
     end;
    
     {Definimos la funcion que hablará con el panel de control}
     {A callback function to export at Control Panel}
     function CPlApplet(hwndCPl: THandle; uMsg: DWORD;
                      lParam1, lParam2: LongInt):LongInt;stdcall;
     var
       NewCplInfo:PNewCplInfo;
     begin
       Result:=0;
       case uMsg of
        {El panel de control nos pregunta si somos un CPL..., devolvemos TRUE}
        {Yes, it's a CPL, return True.}
        CPL_INIT:
         Result:=1;
        {Numero de Iconos de nuestro applet}
        {Icon Count}
        CPL_GETCOUNT:
         Result:=1;
        {Devolvemos info de nuestro icono}
        {Return Info of our Icon}
        CPL_NEWINQUIRE:
         begin
          NewCplInfo:=PNewCplInfo(lParam2);
          with NewCplInfo^ do
          begin
           dwSize:=SizeOf(TNewCplInfo);
           dwFlags:=0;
           dwHelpContext:=0;
           lData:=0;
           {El icono de nuestra aplicacion}
           {An icon to display on Control Panel.}
           hIcon:=LoadIcon(HInstance,'MAINICON');
           {Nombre del applet CPL}
           {CPL applet name}
           szName:='Project1';
           {Descripcion}
           {Description}
           szInfo:='Descripcion del CPL';
           szHelpFile:='';
          end;
        end;
        {Ejecutamos el CPL}
        {Executing our CPL}
        CPL_DBLCLK:
         ExecuteApp;
    
        else Result:=0;
       end;
     end;
    
     {Exportamos la funcion del CPL}
     {Exporting the function of CplApplet}
     exports
       CPlApplet;
     end.
    




  • Ahora compilamos todo, y se nos habrá creado una Project1.DLL en el directorio de nuestro proyecto. Tan sólo tendremos que renombrarla a Project1.CPL y copiarla en el directorio del sistema (Windows/system). Por ultimo, abriremos el panel de control y allí estará nuestra aplicación.