GARANTIR DESCONTO

Fórum Tempo ocioso #241770

06/07/2004

0

Quero saber como fazer para descobrir qual o tempo ocioso que minha aplicação vai ficar.

Por exemplo

Defino que se a aplicação ficar por 60 segundos sem operação de mouse e teclado, ela simplismente irar fechar todos os forms abertos e chamar o formulário de login novamente

Agradeço desde ja


Fknyght

Fknyght

Responder

Posts

06/07/2004

Tatuweb

Certa vez tive que implementar algo parecido. Para o que vc quer fazer basta processar as mensagens WM_KEYDOWN (tecla pressionada) e WM_LBUTTONDOWN (clique com botão esquerdo do mouse). A rotina abaixo mostra o inverso do que vc quer (após um certo tempo ocioso o form de login que é fechado) mas a ideia do processamento é a mesma. Se der algum problema posta de novo.

Na clausula private do form de login coloque:

procedure AppMessage(var Msg: TMsg; var Handled: Boolean);


e declare uma variável global como mostrado abaixo:

   CloseForm: Word;


No OnShow do form de login coloque

procedure TFormLogin.FormShow(Sender: TObject);
begin
  // Zera o contador
  CloseForm := 0;
  //Só habilite o timer aqui
  Timer1.Enabled := TRUE;
  // Processa as mensagens enviadas
  Application.OnMessage := AppMessage;
end;


Implemente a procedure AppMessage

procedure TFormLogin.AppMessage(var Msg: TMsg; var Handled: Boolean);
begin
  if FormLogin.Active then
  begin
    if (Msg.message = WM_KEYDOWN) or (Msg.message = WM_LBUTTONDOWN) then
    begin
      CloseForm := 0;
      Handled := FALSE;
    end;
  end else
    CloseForm := 0;
end;


No evento Timer do componente timer1 coloque o codigo abaixo. Deixe a propriedade Enabled setada para FALSE e a propriedade Interval em 1000.

procedure TFormLogin.Timer1Timer(Sender: TObject);
begin
  Inc (CloseForm);
  // Defina abaixo o tempo em segundos (ex: 10 seg)
  if CloseForm = 10 then
  begin
    TImer1.Enabled := FALSE;
    FormLogin.Close; 
  end;
end;


No form que chamará o form de login declare a unit do form de login.

uses FrmLogin;

begin
  FormLogin.Show;
end;



Responder

Gostei + 0

09/07/2004

Fknyght

Desenvolvi o código que voce postou aqui so que tem uns probleminhas


1 - Qdo trabalho em cima de um TMenu, o código não pega o click do mouse

2 - Não funciona com o botão direto do mouse

3 - Tipo, queria fazer tipo no descansador de tela do windows, se mexer o mouse, reseta a variavel contadora e começa novamente


Grato


Responder

Gostei + 0

09/07/2004

Tatuweb

Para resolver esses problemas altere a linha

[b:e19b79e1c8]if (Msg.message = WM_KEYDOWN) or (Msg.message = WM_LBUTTONDOWN) then [/b:e19b79e1c8]
para
[b:e19b79e1c8]if (Msg.message = WM_KEYDOWN) or (Msg.message = WM_COMMAND) or (Msg.message = WM_MOUSEMOVE) then [/b:e19b79e1c8]

Considerações: Com essa alteração a rotina deixa de processar as mensgens envidas com o click do mouse (nem direito, nem esquerdo). Fiz isso para evitar um processamento redundante, já que para clicar o usuário tem que primeiro mover o mouse.

Caso vc queira processar as mensagens de click do mouse é só modificar a rotina adicionando as mensagens WM_LBUTTONDOWN (clique com o botão esquerdo) e WM_RBUTTONDOWN (clique com o botão direito).


Responder

Gostei + 0

Utilizamos cookies para fornecer uma melhor experiência para nossos usuários, consulte nossa política de privacidade.

Aceitar