Fórum Fechar programa após um período X #177324
25/08/2003
0
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
Curtir tópico
+ 0Posts
25/08/2003
Seek
---------
otto3d@hotmail.com
---------
oTTo Husckows :shock:
Gostei + 0
25/08/2003
Bacalhau
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]
Gostei + 0
25/08/2003
Seek
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:
Gostei + 0
25/08/2003
Bacalhau
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:
Gostei + 0
25/08/2003
Barcelos
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
Gostei + 0
25/08/2003
Barcelos
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
Gostei + 0
26/08/2003
Bacalhau
Gostei + 0
29/09/2004
Amjorge
Gostei + 0
11/05/2005
Dpinho
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
Gostei + 0
12/05/2005
Nildo
Gostei + 0
12/05/2005
Dpinho
ja tentei isto
Tambem tentei WM_OnMouseMove, Mas não dar certo
Gostei + 0
12/05/2005
Dpinho
Gostei + 0
24/06/2007
Aerreira
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?
Gostei + 0
Clique aqui para fazer login e interagir na Comunidade :)