segunda-feira, 30 de março de 2020

Timeout - aplicativo fechar depois de um tempo ocioso

Aqui está um código de exemplo que permitirá que você feche um aplicativo se o usuário estiver dormindo enquanto estiver trabalhando / se ele ficar afk por muito tempo.

Isso pode ser útil para programas como o MIRC, onde eles usam esse valor de tempo limite. Alguns jogos online funcionam assim também para impedir que o usuário use o servidor de banda, também me vem à mente o aplicativo de proteção de tela ou o programa de resfriamento da CPU.

- Primeiro, declare uma constante global chamada MaxTimeOutDelay. Afete-o a algum valor inteiro que representará o número máximo de segundos em que seu programa tem permissão para registrar a inatividade do usuário antes de executar uma ação. 

- Segundo, declare uma variável chamada TimeElapsed como número inteiro. Isso acompanhará o tempo decorrido desde a última atividade do usuário gravada.

- Terceiro, coloque um cronômetro no formulário.

No evento FormCreate, defina TimeElapsed como 0.

Agora declare um procedimento simples que redefinirá o TimeElapsed.

Deve parecer com:

procedure TForm1.ResetTimeElapsed; 
begin 
  TimeElapsed := 0
end

Two event can resume in a sufficient manner the gloabl user activity. 
1 - OnKeyDown Event 
2 - OnMouseMove 

When the user do something the TimeElapsed is reset so for the two event the code will look like this. 

procedure TForm1.FormKeyDown(Sender: TObject; var Key: Word; Shift: TShiftState); 
begin 
  ResetTimeElapsed; 
end

procedure TForm1.FormMouseMove(Sender: TObject; Shift: TShiftState; X, Y: Integer); 
begin 
  ResetTimeElapsed; 
end

Here the last bit of code. On timer event the TimeElapsed is incremented. In short, the Timer Transfer a value to the TimeElapsed variable every second (If you default value for timer wasn't changed). 
Than it's just a simple check to see if the TimeElapsed have reached the MaxTimeOutValue. 

procedure TForm1.Timer1Timer(Sender: TObject); 
begin 
  Inc(TimeElapsed); 
  if TimeElapsed = MaxTimeOutValue then begin 
    Timer1.Enabled := False; 
    Close; 
  end
end

Este programa fecha o aplicativo. Mas, na verdade, é muito mais útil associar o TimeOut a uma 
rotina mais útil. Por exemplo, você pode fazer o computador dormir quando o usuário não fez 
nada por 15 minutos, fazê-lo funcionar na bandeja do sistema para economizar energia / uso de PCU.

Declare a procedure thus: 

procedure TForm1.HandleAppMessage(var Msg: TMsg; var Handled: Boolean); 
begin 
  Case msg.Message of 
    WM_KEYFIRST..WM_KEYLAST, WM_MOUSEFIRST..WM_MOUSELAST: ResetTimeElapsed; 
  end
  Inherited; 
end

and in FormCreate set 
 Application.OnMessage := HandleAppMessage;

Nenhum comentário:

Postar um comentário