tagger tag windows delphi user-inactivity

windows - tag - Cómo detectar un usuario inactivo



tag folders (4)

Es posible que desee ver la respuesta a esta pregunta: Cómo saber cuándo Windows está inactivo [1] es básicamente la misma pregunta que la solución sugerida es utilizar la llamada API GetLastInputInfo [2] .

Esta publicación también explica algunos aspectos: (The Code Project) Cómo comprobar la inactividad del usuario con y sin plataforma invoca en C # [3]

[1] Cómo saber cuándo Windows está inactivo
[2] http://msdn.microsoft.com/en-us/library/ms646302%28VS.85%29.aspx
[3] http://www.codeproject.com/KB/cs/uim.aspx

¿Cómo detectar el usuario inactivo (inactivo) en la aplicación de Windows? Me gustaría cerrar la aplicación cuando no ha habido ninguna entrada (teclado, mouse) del usuario durante un cierto período de tiempo.


Este SecondsIdle no funciona en absoluto. La forma es usar un TTimer combinado con una segunda variable que se restablece cada vez que el usuario ingresa el mouse o el teclado.


Para rastrear el tiempo de inactividad de un usuario, puede conectar la actividad del teclado y el mouse. Sin embargo, tenga en cuenta que la instalación de un enganche de mensajes en todo el sistema es algo muy invasivo y debe evitarse si es posible, ya que requerirá que su archivo DLL de gancho se cargue en todos los procesos.

Otra solución es utilizar la función GetLastInputInfo API (si su aplicación se ejecuta en máquinas Win2000 (y superiores)). GetLastInputInfo recupera el tiempo (en milisegundos) del último evento de entrada (cuando se ha recibido la última actividad de usuario detectada, ya sea desde el teclado o el mouse).

Aquí hay un ejemplo simple. La función SecondsIdle devuelve un número de segundos sin actividad del usuario (llamada en un evento OnTimer de un componente TTimer ).

~~~~~~~~~~~~~~~~~~~~~~~~~ function SecondsIdle: DWord; var liInfo: TLastInputInfo; begin liInfo.cbSize := SizeOf(TLastInputInfo) ; GetLastInputInfo(liInfo) ; Result := (GetTickCount - liInfo.dwTime) DIV 1000; end; procedure TForm1.Timer1Timer(Sender: TObject) ; begin Caption := Format(''System IDLE last %d seconds'', [SecondsIdle]) ; end;

http://delphi.about.com/od/adptips2004/a/bltip1104_4.htm


Su aplicación recibirá un mensaje WM_SYSCOMMAND con SC_SCREENSAVE como ID de comando cuando el protector de pantalla esté a punto de SC_SCREENSAVE . ¿Lo haría? también está el SC_MONITORPOWER comando SC_MONITORPOWER cuando el monitor está a punto de quedarse en blanco (también un mensaje WM_SYSCOMMAND).

Editar: mirando los comentarios, parece que no le importa si el usuario es inador, sino si su aplicación está inactiva.

Esto es facil. Si su aplicación está minimizada, entonces el usuario no está interactuando con ella. Si su aplicación no es la aplicación en primer plano, también es una buena herramienta.

También puede prestar atención a los mensajes en su bomba para ver si ha habido mensajes de entrada de usuario a su aplicación. En C ++ agregar código a la bomba es trivial, en Delphi puede usar un gancho WH_GETMESSAGE para monitorear el gancho de la bomba en el mensaje loop que implementa TApplication. O GetLastInputInfo