Fechar programa após um período X
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]
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
Curtidas 0
Respostas
Seek
25/08/2003
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:
---------
otto3d@hotmail.com
---------
oTTo Husckows :shock:
GOSTEI 0
Bacalhau
25/08/2003
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]
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
Seek
25/08/2003
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:
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
Bacalhau
25/08/2003
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:
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
Barcelos
25/08/2003
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
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
Barcelos
25/08/2003
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
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
Bacalhau
25/08/2003
Manda sempre Barcelos 8)
GOSTEI 0
Amjorge
25/08/2003
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.
GOSTEI 0
Dpinho
25/08/2003
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
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
Nildo
25/08/2003
OnMouseMove ?
GOSTEI 0
Dpinho
25/08/2003
OnMouseMove ?
ja tentei isto
Tambem tentei WM_OnMouseMove, Mas não dar certo
GOSTEI 0
Dpinho
25/08/2003
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
GOSTEI 0
Aerreira
25/08/2003
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:
No FormCreate, tenho:
Porque o OnMessage da aplicação não está sendo processado pela função PegarMensagens?
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:
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:
Application.OnMessage := PegarMensagens;
Porque o OnMessage da aplicação não está sendo processado pela função PegarMensagens?
GOSTEI 0