Page 1 of 1

msgAlert se comporta independiente

PostPosted: Mon Oct 24, 2022 2:02 am
by JoseAlvarez
Hola a todos, esperando que se encuentren muy bien,

Tengo establecido un tiempo maximo en mi aplicacion para que el usuario este inactivo, es decir sin ejecutar nada en la PC, es decir sin tocar el teclado ni el raton. Si esto sucede, aparece un msgAlert() indicando que el tiempo se ha cumplido y la sesion expiró, hasta ahi todo bien, como se muestra en la imagen:

https://datanet.space/fw/aw1.jpg

El problema se presenta cuando la aplicacion esta minimizada. Al vencerse el tiempo, el msgalert() y la ventana se muestran independientes, y al querer maximizar, solo se levanta aquella en que se haga click.

Lo que quiero es que al hacer click bien sea en el msgAlert() o en la ventana, ambos se levanten. Ace dejo un video para graficar lo que sucede.

https://datanet.space/fw/Aw3.mp4

Otra cosa es que para controlar el tiempo, uso la funcion sysIdleSecs() pero la misma controla todo el equipo y quisiera que funcionara solo dentro de mi aplicacion si es posible. Es decir, si se minimiza la aplicacion y el usuario se va por decir a word y tarda alli mas de el tiempo establecido, ese tiempo mi sistema no lo toma en cuenta, es decir no se cierra, solo se cierra cuando el usuario no hace absolutamente nada en la PC.

Alguna idea de como hacerlo u otra forma que funcione como quiero?

Re: msgAlert se comporta independiente

PostPosted: Mon Oct 24, 2022 12:57 pm
by karinha
Code: Select all  Expand view

// tinativo.prg - By William Adami
// exemplo do uso da classe Tinativo
// Apos um tempo de inatividade do mouse
// e do teclado chama uma funcao qualquer.

#include "fivewin.ch"

STATIC oWnd

//************

FUNCTION Main()

   LOCAL nTempo_espera, cNome_funcao, lTimercontinua

   // Tempo a ser esperado ate chamar a funcao
   // -> 1 hora tem 3600 segundos.
   nTempo_espera := 10  // segundos.

   // nome da funcao a ser chamada quando
   // chegar no tempo de espera
   cNome_funcao := "LOGOFF()"  
   // se apos executar a funcao , continua
   // monitorando a inatividade do mouse e teclado.
   lTimercontinua := .F.

   define window oWnd title "Teste de teclado e mouse"

   activate window oWnd ;
      ON INIT tinativo():new( nTempo_espera, cNome_funcao, lTimerContinua )

RETURN NIL

FUNCTION LOGOFF()

   // msgalert( "AQUI ENTRA SUA FUNCAO DE LOGOFF !", "AVISO" )

   IF MsgYesNo( OemToAnsi( "ATEN€ÇO USUµRIO:                       " )+CRLF+ ;
                OemToAnsi( "PROTEJA OS BANCOS DE DADOS DO PROGRAMA." )+CRLF+ ;
                OemToAnsi( "SE NÇO ESTIVER USANDO O WINORCAM.EXE,  " )+CRLF+ ;
                OemToAnsi( "DESLIGUE-O PARA NÇO CORRER RISCOS.     " )+CRLF+ ;
                OemToAnsi( "POSSO DESLIGAR O PROGRAMA? <S> ou <N>??" ),      ;
                OemToAnsi( "AVISO PARA DESLIGAR O WINORCAM.EXE...  " ) )

      //--Fecha o Programa Definitivamente
      LIBERA_TUDO()  // ESTA EM WINORCAM.PRG

      // QUIT

   ENDIF

RETURN NIL

//   tinativo.prg

#include "fivewin.ch"

CLASS TINATIVO

   DATA nTimeInpAntes
   DATA nTimeInpDepois
   DATA cTimeAtu
   DATA nTempo
   DATA oTimerTime
   DATA cFunc
   DATA lContinuar

   METHOD NEW( nTime, cFuncao, lContinua )  CONSTRUCTOR

   METHOD ver_tempo()

ENDCLASS

METHOD new( ntime, cFuncao, lContinua ) CLASS TINATIVO

   ::cfunc := cfuncao
   ::ntempo := ntime
   ::lContinuar := lContinua
   ::oTimerTime := TTimer():New( 1000, { || ::VER_TEMPO() } )
   ::oTimerTime:Activate()
   ::cTimeAtu := time()
   ::nTimeInpAntes := getInputState()    // 0 = erro

RETURN self

METHOD VER_TEMPO CLASS TINATIVO

   LOCAL AUX

   ::nTimeInpDepois := getInputState()

   IF ( ::nTimeInpDepois - ::nTimeInpAntes ) > 0

      ::nTimeInpAntes := getInputState()

      ::cTimeAtu := time()

   ENDIF


   IF ( CONVTIME( time() ) - CONVTIME( ::cTimeAtu ) ) > ::ntempo

      ::oTimerTime:DeActivate()

      aux := ::cfunc
   
      // aqui executa a funcao

      &aux

      if ::lContinuar

         ::oTimerTime:Activate()
         ::cTimeAtu := time()

      ENDIF


   ENDIF

RETURN NIL

FUNCTION CONVTIME( ZZ )

   LOCAL Z

   Z := ( VAL( LEFT(ZZ,2 ) ) * 360 ) + ( VAL( SUBSTR(ZZ,4,2 ) ) * 60 ) + ;
          VAL( RIGHT( ZZ,2 ) )

RETURN Z

//*----------------------------------------------------------------------
#pragma BEGINDUMP
#define _WIN32_WINNT 0x0500
#define WINVER 0x0500
#include "windows.h"
#include "hbapi.h"
HB_FUNC( GETINPUTSTATE )
{
LASTINPUTINFO lpi;
lpi.cbSize = sizeof(LASTINPUTINFO);
if (!GetLastInputInfo(&lpi))
{
hb_retni(0);
}
hb_retni(lpi.dwTime);
}
#pragma ENDDUMP
 
// FIN / END
 


Regards, saludos.

Re: msgAlert se comporta independiente

PostPosted: Tue Oct 25, 2022 12:22 pm
by horacio
Hola, es el comportamiento normal de una dialogo con respecto a la ventana. Se me ocurre que cuando el tiempo expira verificaría el estado de la ventana, si está minimizada la maximizaría y después mostraría el MsgAlert.

Saludos

Re: msgAlert se comporta independiente

PostPosted: Tue Oct 25, 2022 2:09 pm
by JoseAlvarez
horacio wrote:Hola, es el comportamiento normal de una dialogo con respecto a la ventana. Se me ocurre que cuando el tiempo expira verificaría el estado de la ventana, si está minimizada la maximizaría y después mostraría el MsgAlert.

Saludos


Hola Horacio! saludos!

Excelente ! se ve una solución Simple y que debería funcionar a la primera...
Voy a aplicarlo y te comento,

Gracias !!

Re: msgAlert se comporta independiente

PostPosted: Wed Oct 26, 2022 12:51 pm
by JoseAlvarez
horacio wrote:Hola, es el comportamiento normal de una dialogo con respecto a la ventana. Se me ocurre que cuando el tiempo expira verificaría el estado de la ventana, si está minimizada la maximizaría y después mostraría el MsgAlert.

Saludos


Listo amigo, funcionó de lujo!

Muchas Gracias !!

Un abrazo!

Joao, probé el TINACTIVO , funciona exactamente igual al sysIdleSecs() , toma en cuenta el tiempo inactivo de todo el equipo, no de mi aplicacion.

Gracias por tu generosa ayuda de siempre!

Re: msgAlert se comporta independiente

PostPosted: Wed Oct 26, 2022 1:05 pm
by karinha
José, como funciona este sysIdleSecs() ? Puedes hacer un pequeño ejemplo, por favor?

Gracias.

Regards, saludos.

Re: msgAlert se comporta independiente

PostPosted: Wed Oct 26, 2022 1:17 pm
by JoseAlvarez
karinha wrote:José, como funciona este sysIdleSecs() ? Puedes hacer un pequeño ejemplo, por favor?

Gracias.

Regards, saludos.


Seguro que si amigo mio, el fin de semana preparo algo sencillo y lo dejo por acá !!

Re: msgAlert se comporta independiente

PostPosted: Thu Oct 27, 2022 10:23 pm
by horacio
Me alegro!, Abrazo.