Pueden utilizar la siguiente función para detectar un período de inactividad, ya sea en todo Windows o solamente en la aplicación.
CLEAR
PUBLIC tmrCheck
tmrCheck = NEWOBJECT("DetectActivity")
RETURN
DEFINE CLASS DetectActivity as Timer
* Sólo detecta inactividad mientras está en este programa?
JustInThisApp = .T.
* Intervalo de inactividad tras el cual dispara OnInactivity (en segundos)
InactivityInterval = 5
* Intervalo cada el que chequea actividad
Interval = 1000
LastCursorPos = ""
LastKeybState = ""
LastActivity = DATETIME()
CursorPos = ""
KeybState = ""
IgnoreNext = .T.
PROCEDURE Init
DECLARE INTEGER GetKeyboardState IN WIN32API STRING @ sStatus
DECLARE INTEGER GetCursorPos IN WIN32API STRING @ sPos
DECLARE INTEGER GetForegroundWindow IN WIN32API
ENDPROC
PROCEDURE Destroy
CLEAR DLLS GetKeyboardState, GetCursorPos, GetForegroundWindow
ENDPROC
PROCEDURE Timer
WITH This
IF ! .CheckActivity()
* Si no hubo actividad veo si es tiempo de disparar OnInactivity
IF ! ISNULL(.LastActivity) AND ;
DATETIME() - .LastActivity > .InactivityInterval
.LastActivity = NULL && Prevengo disparo múltiple de OnInactivity
.OnInactivity()
ENDIF
ENDIF
ENDWITH
ENDPROC
* Chequeo si hay actividad
PROCEDURE CheckActivity
LOCAL lRet
WITH This
IF .JustInThisApp
IF GetForegroundWindow() <> _VFP.hWnd
* Estoy en otro programa
RETURN lRet
ENDIF
ENDIF
.GetCurState()
IF (!.CursorPos == .LastCursorPos OR !.KeybState == .LastKeybState)
IF ! .IgnoreNext && La 1ra vez no ejecuto
lRet = .T. && Hubo actividad
.OnActivity()
.LastActivity = DATETIME()
ELSE
.IgnoreNext = .F.
ENDIF
.LastCursorPos = .CursorPos
.LastKeybState = .KeybState
ENDIF
ENDWITH
RETURN lRet
ENDPROC
* Devuelve el estado actual
PROCEDURE GetCurState
LOCAL sPos, sState
WITH This
sPos = SPACE(8)
sState = SPACE(256)
GetCursorPos (@sPos)
GetKeyboardState (@sState)
.CursorPos = sPos
.KeybState = sState
ENDWITH
ENDPROC
PROCEDURE OnInactivity
WAIT WINDOW "Inactividad a las " + TIME() NOWAIT
ENDPROC
* Hubo actividad
PROCEDURE OnActivity
WAIT WINDOW "Actividad a las " + TIME() NOWAIT
ENDPROC
ENDDEFINE
Mario Lopez
Genial esta clase. Funciona a la perfección. Muchas gracias por el aporte!!
ResponderBorrarHola... en que parte de tu sistema la pusiste? en el main.prg? en cada form? ... Muchas Gracias
BorrarHola Mario
ResponderBorrarEstuve viendo tu rutina para detectar inactividad en la aplicacion.
Quiero preguntarte:
- En donde pongo la rutina?. En el PRG de inicio, En el Formulario del MAIN (inicio)
- En cada formulario debo poner un TIMER() ?
- Si es asi, que debo poner dentro de cada TIMER() ?.
Bueno Mario por ahora esas son mis dudas.
Si pueden enviarme tu correo electronico asi, te consulto por el Mismo.
Gracias
saludos
Esteban Micossi
foxteban646@gmail.com
Hola Esteban, lograste resolver donde colocar esta rutina?
BorrarPregunto exactamente lo mismo... donde pongo esta rutina? en el main.prg? el intervalo está dado por milisegundos?
BorrarPregunto lo mismo... donde pongo la rutina? en el main.prg? en cada Form? o cómo la llamo en cada form? Muchas gracias... mi mail es eduardo.cleversoft@gmail.com ... muchas gracias
ResponderBorrarESTIMADO MARIO, POR FAVOR, DONDE PONES LA RUTINA EN EL FORM? PARA PODER CERRAR EL PROGRAMA LA RUTINA NO FUNCIONA FUERA DE UN FORMSET.
ResponderBorrarSALUDOS
GIANFRANCO SQUARTINI MANNIELLO
G.SQUARTINI@ITALSOFT.CL