GARANTIR DESCONTO

Fórum Ajuda - contador de tempo ocioso e total de teclas digitadas #370033

27/04/2009

0

Estou tentando implementar 2 funções no delphi, mas toda sem sucesso. Vou enumerá-las

1 - Um contador de tempo ocioso: toda vez que o mouse não é clicado e uma tecla não é digitada, o contador começa a contar. Exemplo: mouse parado e nenhuma ação do teclado, então o contador roda: 1,2,3....até uma ocorrer uma ação (ou do teclado ou do mouse), congelando o contador. Parou novamente o teclado e o mouse, o contador volta a contar, a partir da ultima pausa. Se o contador parou no segundo 5, ele continuar 6, 7, 8...assim sucessivamente...

2 - Total de teclas digitadas: a partir do momento em que o programa é iniciado, quando qualquer tecla for digita (fora do sistema, escrevendo um texto por exemplo) será incrementado um contador na tela principal do sistema. Exempo: apartei a tecla A, o contador mostrará 1, apertei a tecla H, o contador mostrará 2, assim por diante. NÃO É A TECLA QUE ME IMPORTA, E SIM A QUANTIDADE DE TECLAS DIGITADAS EM QUANTO O PROGRAMA ESTIVER RODANDO.

Desde já agradeço a ajuda!!!


Pfloyd_fan

Pfloyd_fan

Responder

Posts

27/04/2009

.lg.

Essa ´parada´ que pode-se dizer AFK (Away From Keyboard)...
Teria um padrão de tempo ocioso para começar o contador!?
Porque ao meu ver, eu colocaria o contador a iniciar so depois de 5-10 minutos parado.

A pessoa pode estar lendo um texto no pc, ou fazendo alguma coisa que necessite ficar parado uns 10 segundos.

Você acha interessante isso, ou apenas o fato de digitar algo ja lhe interessa em acionar o contador!?


Responder

Gostei + 0

27/04/2009

Emarcolongo

pfloyd_fan, olá.

veja este link
[url] http://forum.devmedia.com.br/viewtopic.php?t=28260 [/url]

Acredito que alguma coisa que estão discutindo possa lhe auxiliar, tb.


Responder

Gostei + 0

27/04/2009

Pfloyd_fan

.lg

não há um padrão. O meu interesse é que ao ocorrer em que as duas ações fiquem paradas (tanto mouse quanto teclado) o contador corra, pois a partir deste tempo acumulado é que eu vou disparar o evento. Mesma coisa com o contador de teclas digitadas. Se o cara digitou 300 teclas no final do tempo estabelicido (estou criando um cronometro regrissivo para isso), a tela apresentada é uma, se digtou 500 é outra....

Estou começando a desenvolver um programa para ajudar a evitar lesões do tipo LER/DORT. A pessoa estabelece um tempo (30 minutos por exemplo) e durante este tempo, o total de teclas digitadas e o tempo ocioso acumulado servirão de parâmetros para determinar o tipo de tela será apresentado para o usuário!!! =)

emarcolongo

Obrigado pelo link!!! =)


Responder

Gostei + 0

27/04/2009

Pfloyd_fan

estou me baseando neste aplicativo: http://superdownloads.uol.com.br/download/149/ler-home-edition/


Responder

Gostei + 0

28/04/2009

.lg.

Talvez isso possa te ajudar. Você pode usar as mensagens que o windows produz quando alguma ação é feita.

As que aconcelho a usar neste seu caso é as:
[list:df6900c0fd]
- WM_MOUSEMOVE
- WM_LBUTTONDOWN
- WM_RBUTTONDOWN
- WM_KEYDOWN
[/list:u:df6900c0fd]

São as mensagens que você vai precisar para capturar:
- movimento do mouse.
- click do mouse
- qualquer tecla precionada.

Aqui está o exemplo para o quando precionar alguma tecla:
Procedure WMClose(var Message: TWMClose); message WM_CLOSE;

procedure WMClose(var Message: TWMClose);
Begin
  Inherited; //Se não o colocar você mata várias aplicações que necessitam de capturar a tecla precionada. 
  //O próprio windows, por exemplo.

  //aqui você inicia o seu contador. supondo que sua variável seja "inKeyPressed"...
  Inc(inKeyPressed); //simples não!?
end;



Responder

Gostei + 0

28/04/2009

Pfloyd_fan

VLW, .lg.!!!

Vou testá-las aqui!!! =)

Abraços!!!!


Responder

Gostei + 0

29/04/2009

.lg.

perdao perdao... coloquei errado. rsrsrs
pfloyd_fan,
esta daqui de baixo:
(peguei o WM_CLOSE como exemplo para modificação e nem modifiquei pro WM_KEYDOWN)
Procedure WMKEYDOWN(var Message: TWMKEYDOWN); message WM_KEYDOWN; 

procedure WMKEYDOWN(var Message: TWMKEYDOWN); 
Begin 
  Inherited; //Se não o colocar você mata várias aplicações que necessitam de capturar a tecla precionada. 
  //O próprio windows, por exemplo. 

  //aqui você inicia o seu contador. supondo que sua variável seja "inKeyPressed"... 
  Inc(inKeyPressed); //simples não!? 
end;


Desculpe aí.
Você pode ir na unit [i:2c57f894cb]Forms[/i:2c57f894cb], que você pode ver milhares de outros exemplos de capturação de mensagens.

Espero que ajude.
Qualquer coisa estamos aí.
Abraços,
.lg.


Responder

Gostei + 0

29/04/2009

Pfloyd_fan

declarei a procedure ´WMKEYDOWN´ lá na parte de declarações privadas:

private
{ Private declarations }
Procedure WMKEYDOWN(var Message: TWMKEYDOWN); message WM_KEYDOWN;

-----------------------------

depois implementei um contador, como o sugerido:

procedure TForm1.WMKEYDOWN(var Message: TWMKEYDOWN);
var cont: integer; qwert:string;
begin
Inherited;
cont:=1;
cont:= cont + 1;
qwert:= Inttostr(cont);
Label2.Caption := qwert;
----------------------------------

compilou, mas a rotina não funcionou!!! =/


Responder

Gostei + 0

30/04/2009

.lg.

Você colocou no form principal!?


Responder

Gostei + 0

30/04/2009

Pfloyd_fan

sim, TForm1 é a form principal!!!


Responder

Gostei + 0

01/05/2009

Barcelos

Amigos,

No tópico abaixo discutimos algo parecido. Talvez ajude em algo:

http://forum.devmedia.com.br/viewtopic.php?t=19507

[]´s


Responder

Gostei + 0

02/05/2009

Pfloyd_fan

Obrigado pelo link, Barcelos.

Creio que me será muito útil!!!

Abraços!!!


Responder

Gostei + 0

04/05/2009

.lg.

realmente, muito útil o link. está no quickyLinks do meu favoritos.
Barcelos, Me ajudou também.

Obrigado.
Abraços,
.lg.


Responder

Gostei + 0

05/05/2009

Pfloyd_fan

tentei implementar a função para capturar a tecla digitada. Compilou, mas por enquanto não deu certo. Vou postar o código:
------------------------------------------------------------------------------------

public
{ Public declarations }
procedure PegarMensagens(var Msg: TMsg; var Pegou: Boolean);
procedure Comece;
end;

...


procedure TForm1.Comece;
var cont: integer;
begin
cont:=0;
cont:=cont + 1;
Label2.caption:= inttostr(cont);
end;



procedure TForm1.PegarMensagens(var Msg: TMsg; var Pegou: Boolean);
begin
//Pega aqui as mensagens que serão manipuladas
case Msg.Message of
WM_KEYDOWN:
comece;
end;
end;

end.

--------------------------------------------------------------------------

usei o modelo postado aqui pelo Barcelos. Se alguém puder me ajudar a corrigir o erro, ficaria imensamente grato. Desde já agradeço!!!


Responder

Gostei + 0

07/05/2009

Pfloyd_fan

consegui fazer o aplicativo reconhecer quando uma tecla é digitada apenas quando o programa está ativo. É bem simples até:

-----------------
procedure TForm1.FormKeyDown(Sender: TObject; var Key: Word; Shift: TShiftState);
begin
cont:=cont+1;
label2.caption:= inttostr(cont);
end;
-------------------------
o maior problema é quando eu minimizo ou utilizo outra aplicação junto com o programa. Ele não conta a conta a tecla que eu digitei, quando por exemplo, eu estou escrevendo um texto no WORD e o aplicativo fica de BackGround!!!


Responder

Gostei + 0

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

Aceitar