Fórum Fechar programa após um período X #177324

25/08/2003

0

Caros Amigos,

Gostaria de fazer o seguinte: Meu programa deverá ser fechado automaticamente após um período X de inatividade.
Alguém sabe como fazê-lo?

Obrigado Antecipadamente.

Barcelos
osbarcelos@hotmail.com

------
[color=blue:d581e11fa7]Título editado pelo moderador Nildo. Leia as regras de conduta.[/color:d581e11fa7]


Barcelos

Barcelos

Responder

Posts

25/08/2003

Seek

cara, eu sei fazer em cobol, mas, eu tambem to querendo saber como se faz em delphi, caso voce descubra, favor me envie um email.

---------
otto3d@hotmail.com
---------

oTTo Husckows :shock:


Responder

Gostei + 0

25/08/2003

Bacalhau

GRANDE BARCELOS, TUUUDO BÃO??

Fazes assim:
crias uma variável global do tipo TDateTime.

var hora_inicial : TDateTime;

Quando entrares no programa esta variável é carregada com a hora do sistema.

Entretanto colocas um TTimer com o seguinte código:

var hora_final : TDateTime;

hora_final := Now;
if hora_final > hora_inicial then
begin
timer1.enabled := false;
close;
end;

tooooim!! Lá se vai programa

Abraço

Bacalhau[/u]


Responder

Gostei + 0

25/08/2003

Seek

ei bacalhau,

eu acho que o nosso companheiro acima quer que o sistema feche por inatividade, caso o user nao use o teclado nem o mouse por um determinado tempo..

saco??

:shock:


Responder

Gostei + 0

25/08/2003

Bacalhau

Pois é, bolas! Agora é que me apercebi! Bom, então aí há que registar a ocorrência de todos os eventos (onclick, etc) na aplicação e cada vez que ocorrerem, a tal variavelzinha global é recarregada com a hora do sistema.

No caso há que controlar não uma hora prédefinida mas o intervalo, entre a última ocorrência e o tempo de inactividade.

Porque será que nem eu entendi esta resposta??? :oops:


Responder

Gostei + 0

25/08/2003

Barcelos

Fala Galera!!!


Como o SeeK disse, o programa deve fechar por inatividade.

Bacalhau, tentei uma rotina parecida com a sua a princípio, mas gravar todos os click´s seria bem trabalhoso em um sistema grande como o meu.

Estou tentado usar o evento OnIdle do objeto Application, mas ainda estou tendo problemas.

Se houver sugestões, mandem pra cá.
Se eu descobrir como fazer, publico o código aqui.

Abraços
Barcelos
osbarcelos@hotmail.com


Responder

Gostei + 0

25/08/2003

Barcelos

Fala Galera,

Acredito que encontrei a solução.
Tentando aproveitar a idéia do Bacalhau (Amigão te devo mais uma!!!) de registrar os eventos, cheguei ao método OnMessage do Objeto Application.
(Dêem uma olhada na ajuda do Delphi que está bem explicado).
Juntei então à algumas rotinas que eu já tinha e BINGO!!!
Testei apenas com um formulário, mas como o objeto Application é global, creio que funcionará em todo o programa.
Segue o código na íntegra. (Utilizei somente o formulário e um timer):
unit Unit1;

interface

uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
ExtCtrls;

type
TForm1 = class(TForm)
Timer: TTimer;
procedure TimerTimer(Sender: TObject);
procedure FormCreate(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
procedure PegarMensagens(var Msg: TMsg; var Pegou: Boolean) ;
procedure Comece;
procedure finalize;
end;

var
Form1: TForm1;
MinutosInativos : Integer;
Minutos : Integer;

implementation

{$R *.DFM}

procedure TForm1.Comece;
begin
Timer.Enabled := True;
end;

procedure TForm1.finalize;
begin
Timer.Enabled := False;
end;

procedure TForm1.PegarMensagens(var Msg: TMsg; var Pegou: Boolean) ;
begin
//Pega aqui as mensagens que serão manipuladas
//se for uma destas, quer dizer que o sistema está em atividade.
//Existem muitas outras mensagens, dê uma olhada na unidade Messages e
//as inclua aqui se quiser

case Msg.Message of
WM_LBUTTONDBLCLK, WM_MBUTTONDBLCLK, WM_RBUTTONDBLCLK,
WM_LBUTTONDOWN, WM_MBUTTONDOWN, WM_RBUTTONDOWN,
WM_NCLBUTTONDOWN, WM_NCMBUTTONDOWN, WM_NCRBUTTONDOWN,
WM_DEADCHAR, WM_KEYDOWN, WM_SYSCHAR, WM_SYSKEYDOWN,
WM_SYSDEADCHAR :
begin
//Se pegou uma destas mensagens, primeiro
//Coloca o timer desabilitado e depois...
Finalize ;
//começa tudo de novo...
Comece;
end ;
end ;
end ;


procedure TForm1.TimerTimer(Sender: TObject);
begin
MinutosInativos := MinutosInativos + 1;
if (MinutosInativos = Minutos) then
begin
//Zera os minutos inativos, se for igual ao número de minutos desejados
MinutosInativos := 0;
//aqui você coloca o que quizer (fechar o sistema por exemplo)
ShowMessage(´Você esteve inativo e será finalizado´);
end;
end ;

procedure TForm1.FormCreate(Sender: TObject);
begin
//Nota: Coloque o Timer como enable = True e com Interval = 60000 (1 minuto)


Minutos := 1 ; //quantos minutos esperar
MinutosInativos := 0 ; //zera o tempo de inatividade
//Nota explicativa:
//Tentei usar o OnIdle, porque li na ajuda que é usado quando a aplicação está
//inativa, (ou seja não há processamento). Porém, não consegui ´domar´ este método.
//com o método OnMessage, posso isolar somente as mensgens que eu quero.
//Vocês podem notar por exemplo que não usei a mensagem WM_MOUSEMOVE, pois não quero
//que somente mexer com o mouse seja contado como trabalho. Você pode colocar, se quiser.
Application.OnMessage := PegarMensagens ;
end;

end.

Por favor testem e se tiverem melhorias ou sugestões, publiquem aqui por favor.
Espero que seja de utilidade para todos.

Abraços
Barcelos
osbarcelos@hotmail.com


Responder

Gostei + 0

26/08/2003

Bacalhau

Manda sempre Barcelos 8)


Responder

Gostei + 0

29/09/2004

Amjorge

Caros amigos, basta usar o evento OnIdle da Application (componente ApplicationEvents). OnIdle ocorre sempre que a aplicação ´está parada´. Assim, toda vez que entrar em Idle, o evento OnIdle, deve desligar o timer, setar o timer para o tempo desejado e depois ligar o timer. Ralei pacas, procurei nas APIs do Windows, mas a resposta par esta nescessidade está no próprio Delphi.


Responder

Gostei + 0

11/05/2005

Dpinho

WM_LBUTTONDBLCLK, WM_MBUTTONDBLCLK, WM_RBUTTONDBLCLK,
WM_LBUTTONDOWN, WM_MBUTTONDOWN, WM_RBUTTONDOWN,
WM_NCLBUTTONDOWN, WM_NCMBUTTONDOWN, WM_NCRBUTTONDOWN,
WM_DEADCHAR, WM_KEYDOWN, WM_SYSCHAR, WM_SYSKEYDOWN,
WM_SYSDEADCHAR :

preciso saber como verificar se o mouse foi movido no formulario


Responder

Gostei + 0

12/05/2005

Nildo

OnMouseMove ?


Responder

Gostei + 0

12/05/2005

Dpinho

OnMouseMove ?

ja tentei isto
Tambem tentei WM_OnMouseMove, Mas não dar certo


Responder

Gostei + 0

12/05/2005

Dpinho

Bem a questão do MouseMove esta resolvido, agora é o seguinte, meu programa utiliza a troca de fotos utilizando o componente MDIWallpape, por isto não posso indentificar a inatividade do sistema, preciso de uma dica de como contornar isto. preciso que ao ficar inativo por 10 minutos feche os controles e fique somente o MdiWallpaper trocando as fotos. se alguem puder ajudar, entre em contato pelo meu msn e mando meu codigo


Responder

Gostei + 0

24/06/2007

Aerreira

Amigos,

Desculpem re-abrir esse tópico, porém estou usando funções baseadas nesses seus exemplos. O timer está ativando certinho, quando atinge o tempo limite consigo fazer o logoff do usuário, porém não consigo interromper o timer por atividade do usuario (seja movimento ou clique do mouse ou uso do teclado), pois a função que processa as mensagens (abaixo) não executa NUNCA.

Debugando a aplicação vejo que nunca passa naquele ponto, ou seja, não para de somar o contador (TimeOut) que sempre chega ao seu limite e faz o log-off do usuário.

Veja o código da função:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
procedure TfmMain.PegarMensagens(var Msg: TMsg; var Pegou: Boolean);
begin
  case Msg.Message of
    WM_LBUTTONDBLCLK, WM_MBUTTONDBLCLK, WM_RBUTTONDBLCLK,
    WM_LBUTTONDOWN, WM_MBUTTONDOWN, WM_RBUTTONDOWN,
    WM_NCLBUTTONDOWN, WM_NCMBUTTONDOWN, WM_NCRBUTTONDOWN,
    WM_DEADCHAR, WM_KEYDOWN, WM_SYSCHAR, WM_SYSKEYDOWN,
    WM_MOUSEMOVE, WM_SYSDEADCHAR:
    begin
      TimeOut := 0;
      IdleTmr.Enabled := False;
      IdleTmr.Enabled := True;
    end;
  end;
end;


No FormCreate, tenho:

1
Application.OnMessage := PegarMensagens;


Porque o OnMessage da aplicação não está sendo processado pela função PegarMensagens?


Responder

Gostei + 0

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

Aceitar