Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   API de Windows (https://www.clubdelphi.com/foros/forumdisplay.php?f=7)
-   -   Capturar ninguna acción (https://www.clubdelphi.com/foros/showthread.php?t=10499)

muli 20-05-2004 20:45:28

Capturar ninguna acción
 
Necesito capturar mientras se esté ejecutando mi programa si existe actividad en el ordenador, es decir, como si yo fuera a lanzar el salvapantallas, que no es el caso, es para que pasado un tiempo sin trabajar en el ordenador se salga fuera del programa automáticamente.

Gracias.

Saludos

roman 20-05-2004 20:46:45

Busca acerca del evento OnIdle del objeto TApplication.

// Saludos

muli 21-05-2004 20:38:13

ok, he puesto lo siguiente y parece que funciona es poco chapucero, pero!

procedure TForm1.MyIdleHandler(Sender: TObject; var Done: Boolean);
begin
Timer1.Enabled:=False;
Timer1.Enabled:=True;
end;


procedure TForm1.FormCreate(Sender: TObject);
begin
Application.OnIdle:= MyIdleHandler;
end;

En el timer tengo el tiempo que quiere el usuario mantener activa la aplicación y cuando llega a cumplirse ese tiempo


procedure TForm1.Timer1Timer(Sender: TObject);
begin
Timer1.Enabled:=False;
ShowMessage('han pasado x tiempo sin hacer nada');
utiles.CierraTablas(Datos) // Cierro todas las fuentes de datos
Halt; // cierro el programa
end;

Pero, yo quisiera complicarlo un poco más, desearía capturar también el tiempo de inactivad en el propio windows, tal y como hace el salvapantallas.
Alguna idea?

Gracias, y Saludos

DarkByte 21-05-2004 22:08:48

muli, intenta encerrar tu código en las etiquetas [ Delphi ] y [ / Delphi ] (pero sin espacios), y tampoco estaría de mal que identases tu código.

Para que veas que tal queda:
Código Delphi [-]
procedure TForm1.MyIdleHandler(Sender: TObject; var Done: Boolean);
  begin
    Timer1.Enabled:=False;
    Timer1.Enabled:=True;
  end;


procedure TForm1.FormCreate(Sender: TObject);
  begin
    Application.OnIdle:= MyIdleHandler;
   end;

procedure TForm1.Timer1Timer(Sender: TObject);
  begin
    Timer1.Enabled:=False;
    ShowMessage('han pasado x tiempo sin hacer nada');
    utiles.CierraTablas(Datos) // Cierro todas las fuentes de datos
    Halt; // cierro el programa
  end;

DarkByte 21-05-2004 22:09:24

Lo he identado a mano, a si que se van a ver errores de espacio seguro.

muli 21-05-2004 23:25:35

Me parece muy bonito, pero yo espero algo funcional no bonito, seguro que a la gente que le interesa el post le da igual si está en azul o en negrita lo que quiere es que funcione y aprender de la respuesta.

No me interpretes mal, pero me parece que existen cosas mas importantes que la belleza a la hora de contestar.

roman 21-05-2004 23:35:50

Disculpa muli pero la recomendación de DarkByte la pude haber hecho yo o cualquier otro moderador. Te recomiendo que leas este aviso que se encuentra al principio de todos los foros. El colorear el texto y darle una correcta indentación no sólo es para que se vea bonito sino para que sea claro de leer, de manera que no nos da igual. Si deseas ayuda lo correcto es exponer claramente las dudas y ello abarca la legibilidad del código.

// Saludos

DarkByte 22-05-2004 09:50:24

Muli, podrías tambien poner otra aplicación como salvapantallas, y que cuando se ejecutase, enviase un mensaje a tu aplicación con la cual esta se cierra. Después, la aplicación "salvapantallas" ejecutaría el verdadero salvapantallas y se cerraría...

No se, es una posiblilidad, no?

muli 22-05-2004 12:42:06

ok, es una buena idea, puedo tener un proceso corriendo siempre en la aplicación que detecte si está el salvapantallas activado y si éste está activado cerrar la aplicación, lo que pasa es que obligo al usuario a tener un salvapantallas, y no se si estando la aplicación por ejemplo minimizada sigue corriendo el proceso.

Saludos. Gracias.

DarkByte 22-05-2004 13:21:03

O puedes poner dicho proceso como salvapantalla, y que al activarse, cierre la aplicación y después, si el usuario quiere, ejecutar un salvapantallas.

roman 22-05-2004 18:39:37

Vamos a ver, no sé si estoy entendiendo bien.

Aquí el problema es cómo detectar actividad en el ordenador pues la inactividad no tiene problema: si no hay actividad en el ordenador tampoco la hay en tu aplicación. Así, aún cuando el usuario tenga minimizada tu aplicación, si está trabajando en otra cosa la aplicacion no debe cerrarse. ¿Es correcto esto? Porque entonces creo que lo que requieres es un gancho del teclado y del mouse para poder detectar la actividad de éstos en todo el sistema y no sólo en tu aplicación. Si es así te recomiendo que busques acerca de hooks en la ayuda del SDK de Windows. Hay un ejemplo de un gancho del teclado en mi página en la unidad hooks.pas aunque tal parece que dichos ganchos deben implementarse en una dll.

// Saludos


La franja horaria es GMT +2. Ahora son las 04:17:17.

Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi