verificar ociosidade de sistema

Projeto MiniGui - Biblioteca visual para Harbour/xHarbour

Moderador: Moderadores

rossine
Usuário Nível 3
Usuário Nível 3
Mensagens: 325
Registrado em: 06 Ago 2007 09:57
Localização: Divinópolis-MG

verificar ociosidade de sistema

Mensagem por rossine »

Olá pessoal,

Eu tinha um código feito em minigui aqui que detecta a inatividade do teclado e mouse e também ao termino de um determinado tempo ele executa uma função simulando uma proteção de tela.

Veja se ele server pra vocês:

Código: Selecionar todos

#include "minigui.ch"

static oWnd, oTimerTime, oLabel, oLabel2

*************
function main
*************

define window oWnd title "Teste de teclado e mouse" MAIN

   @50, 20 Label oLabel Value "" AUTOSIZE TRANSPARENT

   @90, 20 Label oLabel2 Value "Se o teclado ou mouse for usado o contador será reiniciado..." AUTOSIZE TRANSPARENT

   DEFINE TIMER Timer1 INTERVAL 1000 ACTION{ || VER_TEMPO() }

end window

activate window oWnd

return NIL

*************************
static function VER_TEMPO
*************************

oWnd.oLabel.value := "Vou executar a proteção de tela em " + hb_ntos(int(11 - sysidlesecs())) + " segundos"

if sysidlesecs() > 10
   oWnd.Timer1.enabled := .F.
   msgstop( "executando a proteção de tela" )
   oWnd.Timer1.enabled := .t.
endif

return NIL

**----------------------------------------------------------------------

#pragma BEGINDUMP

#include "windows.h"
#include "hbapi.h"
/*
typedef struct tagLASTINPUTINFO {
    UINT cbSize;
    DWORD dwTime;
} LASTINPUTINFO, *PLASTINPUTINFO;
*/
WINUSERAPI BOOL WINAPI GetLastInputInfo(PLASTINPUTINFO);
typedef  BOOL (WINAPI *GETLASTINPUTINFO_)(PLASTINPUTINFO);

HB_FUNC( SYSIDLESECS ) 
{
   HINSTANCE handle= LoadLibrary("user32.dll");
   if ( handle)
   {
      GETLASTINPUTINFO_ pFunc;
      pFunc = GetProcAddress( handle,"GetLastInputInfo" );
      if (pFunc)
      {
         LASTINPUTINFO lpi;
    
         lpi.cbSize = sizeof(LASTINPUTINFO);

         if (!pFunc(&lpi))
         {
            hb_retni(0);
         }
         else
         {
            hb_retnd( ( DOUBLE ) ( GetTickCount() - lpi.dwTime ) * 0.001 ); 
         }
      }
   else
      {
         hb_retni(0);
      }
   }

   if (handle)
      {
         FreeLibrary( handle);
      }
}
#pragma ENDDUMP
**----------------------------------------------------------------------

Vejam que na rotina em C++ tem um código comentado. Se precisarem tirem este comentário.

Bom, espero ter ajudado.

Abraços,

Rossine.
Rossine.

Harbour 3.4, MingW / Msvc, QT, Qt5xhb, GtQtc, DbfCdx, MySql/MariaDB.
Avatar do usuário
Toledo
Administrador
Administrador
Mensagens: 3133
Registrado em: 22 Jul 2003 18:39
Localização: Araçatuba - SP
Contato:

verificar ociosidade de sistema

Mensagem por Toledo »

Rossine, seu código está bem mais completo.

Abraços,
Anexos
idlesystem2.zip
(650.84 KiB) Baixado 180 vezes
Toledo - Clipper On Line
toledo@pctoledo.com.br
Harbour 3.2/MiniGui/HwGui
Faça uma doação para o fórum, clique neste link: http://www.pctoledo.com.br/doacao
Avatar do usuário
asimoes
Colaborador
Colaborador
Mensagens: 4919
Registrado em: 26 Abr 2007 16:48
Localização: RIO DE JANEIRO-RJ

verificar ociosidade de sistema

Mensagem por asimoes »

Rossine,

Obrigado por compartilhar.

Fiz uma correção na função e agora está funcionando.

Testei assim:

Código: Selecionar todos

DEFINE TIMER Timer_1 OF Form_Main INTERVAL 1000 ACTION Aviso()

FUNCTION Aviso
   Form_Main.StatusBar.Item(1) := SecToTime(PegaInatividade()) //só para saber se está ok.
   IF PegaInatividade() > 60
      MsgInfo("Parei")
   ENDIF
RETURN Nil

Código: Selecionar todos

#pragma BEGINDUMP
#include "windows.h"
#include "hbapi.h"

HB_FUNC( PEGAINATIVIDADE ) 
{
   typedef struct tagLASTINPUTINFO
   {
       UINT cbSize;
       DWORD dwTime;
   } LASTINPUTINFO, *PLASTINPUTINFO;

   WINUSERAPI BOOL WINAPI GetLastInputInfo(PLASTINPUTINFO);
   typedef  BOOL (WINAPI *GETLASTINPUTINFO_)(PLASTINPUTINFO);

   HINSTANCE handle= LoadLibrary("user32.dll");
   if ( handle)
   {
      GETLASTINPUTINFO_ pFunc;
      pFunc = GetProcAddress( handle,"GetLastInputInfo" );
      if (pFunc)
      {
         LASTINPUTINFO lpi;
    
         lpi.cbSize = sizeof(LASTINPUTINFO);

         if (!pFunc(&lpi))
         {
            hb_retni(0);
         }
         else
         {
            hb_retnd( ( DOUBLE ) ( GetTickCount() - lpi.dwTime ) * 0.001 ); 
         }
      }
   else
      {
         hb_retni(0);
      }
   }

   if (handle)
      {
         FreeLibrary( handle);
      }
}

#pragma ENDDUMP
►Harbour 3.x | Minigui xx-x | HwGui◄
Pense nas possibilidades abstraia as dificuldades.
Não corrigir nossas falhas é o mesmo que cometer novos erros.
A imaginação é mais importante que o conhecimento. (Albert Einstein)
Avatar do usuário
asimoes
Colaborador
Colaborador
Mensagens: 4919
Registrado em: 26 Abr 2007 16:48
Localização: RIO DE JANEIRO-RJ

verificar ociosidade de sistema

Mensagem por asimoes »

Uma pequena correção:

Código: Selecionar todos

FUNCTION AVISO
   Form_Main.StatusBar.Item(1) := SecToTime(PegaInatividade())
   IF PegaInatividade() > 60
      Form_Main.Timer_1.Enabled:=.F.
      MsgInfo("Parei")
      Form_Main.Timer_1.Enabled:=.T.
   ENDIF
RETURN Nil
►Harbour 3.x | Minigui xx-x | HwGui◄
Pense nas possibilidades abstraia as dificuldades.
Não corrigir nossas falhas é o mesmo que cometer novos erros.
A imaginação é mais importante que o conhecimento. (Albert Einstein)
rossine
Usuário Nível 3
Usuário Nível 3
Mensagens: 325
Registrado em: 06 Ago 2007 09:57
Localização: Divinópolis-MG

verificar ociosidade de sistema

Mensagem por rossine »

Rossine, seu código está bem mais completo.
OK Toledo :D

Asimões,

Obrigado pela correção principalmente no código C++ que não entendo nada. Só uma pequena correção em teu código para ele ficar 100% na minha opnião:
Criei a variável nInat para armazenar o retorno da função PegaInatividade(), para evitar a execução da mesma duas vezes, ok ?

Código: Selecionar todos

DEFINE TIMER Timer_1 OF Form_Main INTERVAL 1000 ACTION Aviso()

FUNCTION Aviso
   local nInat := SecToTime(PegaInatividade()) //só para saber se está ok.
   Form_Main.StatusBar.Item(1) := nInat
   IF nInat > 60
      Form_Main.Timer_1.Enabled:=.F.
      MsgInfo("Parei")
      Form_Main.Timer_1.Enabled:=.T.
   ENDIF
RETURN Nil
Corrija-me se eu estiver errado ou como melhorar o código ok ?

Obrigado,

Rossine.
Rossine.

Harbour 3.4, MingW / Msvc, QT, Qt5xhb, GtQtc, DbfCdx, MySql/MariaDB.
Avatar do usuário
asimoes
Colaborador
Colaborador
Mensagens: 4919
Registrado em: 26 Abr 2007 16:48
Localização: RIO DE JANEIRO-RJ

verificar ociosidade de sistema

Mensagem por asimoes »

Rossine,

Com o timer a cada 1 seg. o valor de nInat sempre vai estar atualizado. sempre há uma chamada a função PegaInatividade()

Eu acho que o código atende o que o Hasa quer.
►Harbour 3.x | Minigui xx-x | HwGui◄
Pense nas possibilidades abstraia as dificuldades.
Não corrigir nossas falhas é o mesmo que cometer novos erros.
A imaginação é mais importante que o conhecimento. (Albert Einstein)
Claudio Soto
Colaborador
Colaborador
Mensagens: 566
Registrado em: 27 Ago 2012 12:31
Localização: Uruguay
Contato:

verificar ociosidade de sistema

Mensagem por Claudio Soto »

Un pequeño aporte,
no es necesario llamar en forma indirecta la función GetLastInputInfo:

Código: Selecionar todos

#pragma BEGINDUMP

#include "windows.h"
#include "time.h"
#include "hbapi.h"

HB_FUNC( PEGAINATIVIDADE ) 
{
   LASTINPUTINFO lpi;
   lpi.cbSize = sizeof (LASTINPUTINFO);
   GetLastInputInfo (&lpi);
   hb_retnd( ( DOUBLE ) ( GetTickCount() - lpi.dwTime ) / CLOCKS_PER_SEC ); 
}

#pragma ENDDUMP
Saludos.
Dr. Claudio Soto
(Uruguay)
http://srvet.blogspot.com
Avatar do usuário
HASA
Colaborador
Colaborador
Mensagens: 1088
Registrado em: 01 Set 2003 19:50
Localização: São Paulo
Contato:

verificar ociosidade de sistema

Mensagem por HASA »

:)) :* :{
Muito Bom dia, gostaria de agradecer a todos que prestaram sua colaboração nesse pequeno projeto que de forma simples podera abrir portas nas mentes brilhantes dos colegas.
Valeu Toledo por ter plantado a primeira semente, e aos demais que a adubaram. ( Nossa nem sou do campo e estou quase criando uma horta aqui :)) ) mas... a verdade é que fiquei muito Feliz com o resultado.
X:)
HASA
Responder