Crear un salvapantallas en tu aplicacion  

Enviado Por: Q3 Team
Web : http://www.q3.nu
Email: dlib@q3.nu
Fecha: 19/08/99

Truco accedido 70 veces

 


En este truco haremos dos ejemplos. A mi modo de ver, el segundo me gusta más que el primero:




Primer Ejemplo



Usaremos una variable global (Tiempo:integer) y un timer (Timer1) para contar el tiempo de inactividad de nuestro salvapantallas
Capturaremos los mensajes WM_KEYDOWN y WM_MOUSEMOVE para resetear la cuenta de tiempo y desactivar nuestro salvapantallas si hubiera sido activado

  • Ponemos un TLabel (Label1) y un TTimer (Timer1) en nuestra form
  • Definimos nuestra variable global para contar tiempo en el var de la form:


         var
           Form1: TForm1;
           Tiempo:integer;
    



  • Ponemos este código en el OnTimer de Timer1:


     procedure TForm1.Timer1Timer(Sender: TObject);
     begin
       If Tiempo >= 10
         then
           {Si han pasado 10 segundos}
           {If 10 seconds have passed}
           Label1.Caption:='Salvapantallas Activado/Screensaver active'
         else
           Inc(Tiempo);
     end;
    



  • Ahora, ponemos nuestra procedure de tratamiento de mensajes en el implementation de la form:


     procedure TForm1.AppMessage(var msg:tmsg; var handled:boolean);
     begin
       if (msg.message = WM_KEYDOWN) or (msg.message = WM_MOUSEMOVE) then
       begin
         {Esto se ejecutara cuando muevan el raton sobre tu apliacion o pulsen
         una tecla}
         Label1.Caption:='DESACTIVADO/DEACTIVATE';
         Tiempo:=0;
       end;
     end;
    



  • Sin olvidarnos de declararla en el private de la form:


     type
       TForm1 = class(TForm)
         Timer1: TTimer;
         Label1: TLabel;
         procedure FormCreate(Sender: TObject);
         procedure Timer1Timer(Sender: TObject);
       private
         { Private declarations }
         procedure AppMessage(var msg:tmsg;var handled:boolean);
    



  • Por ultimo, en el OnCreate de la form, inicializamos nuestro invento:


     procedure TForm1.FormCreate(Sender: TObject);
     begin
       {Reseteamos cuenta de tiempo}
       {Reset time count}
       Tiempo:=0;
       {Asignamos nuestra procedure de tratamiento de mensajes}
       {Assign our message treatment procedure}
       Application.OnMessage:=AppMessage;
     end;
    



    Por supuesto, el invento lo que hace es cambiar el caption de Label1. En lugar de hacer eso, puedes poner negra la form, o hacer cualquier otro efecto...





    Segundo Ejemplo



    Usaremos en lugar de un timer, el mensaje de Windows WM_SysCommand, comprobando el wparam para ver si se trata de SC_ScreenSave, ya que significará que el tiempo del salvapantallas de windows ha expirado. Esto tiene la ventaja de que usaremos los settings del usuario para nuestro salvapantallas (el tiempo que el haya asignado y si lo tiene activado o no).

    Se trata de:

  • Capturar el mensaje WM_SysCommand, comprobando el wparam para ver si se trata de SC_ScreenSave, ya que significará que el tiempo del salvapantallas de windows ha expirado.
  • Capturar los mensajes WM_KEYDOWN y WM_MOUSEMOVE para desactivar nuestro salvapantallas y volver a la normalidad:


  • Pon un TLabel en tu form (Label1)
  • Pon esta linea en el private de la form:


          procedure AppMessage(var msg:tmsg;var handled:boolean);
    



  • Y su correspondiente procedure en la implementation de la form:


     procedure TForm1.AppMessage(var msg:tmsg; var handled:boolean);
     begin
       if (msg.message=wm_syscommand) and (msg.wparam=sc_screensave) then
       begin
         {esto se ejecutará cuando el salvapantallas de Windows se active}
         Label1.Caption:='Saltavantallas Activado';
         {y con esta linea evitamos que se active el salvapantallas de     Windows}
         handled:=true;
       end;
    
       if (msg.message = WM_KEYDOWN) or (msg.message = WM_MOUSEMOVE) then
       begin
         {Esto se ejecutara cuando muevan el raton sobre tu apliacion o pulsen
         una tecla}
         Label1.Caption:='DESACTIVADO';
       end;
     end;
    



  • Asignamos nuestra procedure al evento Application.OnMessage, lo cual haremos en el OnCreate de la form:


     procedure TForm1.FormCreate(Sender: TObject);
     begin
       Application.OnMessage:=AppMessage;
     end;