Ajuda - contador de tempo ocioso e total de teclas digitadas
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!!!
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
Curtidas 0
Respostas
.lg.
27/04/2009
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!?
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!?
GOSTEI 0
Emarcolongo
27/04/2009
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.
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.
GOSTEI 0
Pfloyd_fan
27/04/2009
.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!!! =)
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!!! =)
GOSTEI 0
Pfloyd_fan
27/04/2009
estou me baseando neste aplicativo: http://superdownloads.uol.com.br/download/149/ler-home-edition/
GOSTEI 0
.lg.
27/04/2009
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:
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;
GOSTEI 0
Pfloyd_fan
27/04/2009
VLW, .lg.!!!
Vou testá-las aqui!!! =)
Abraços!!!!
Vou testá-las aqui!!! =)
Abraços!!!!
GOSTEI 0
.lg.
27/04/2009
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)
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.
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.
GOSTEI 0
Pfloyd_fan
27/04/2009
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!!! =/
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!!! =/
GOSTEI 0
.lg.
27/04/2009
Você colocou no form principal!?
GOSTEI 0
Pfloyd_fan
27/04/2009
sim, TForm1 é a form principal!!!
GOSTEI 0
Barcelos
27/04/2009
Amigos,
No tópico abaixo discutimos algo parecido. Talvez ajude em algo:
http://forum.devmedia.com.br/viewtopic.php?t=19507
[]´s
No tópico abaixo discutimos algo parecido. Talvez ajude em algo:
http://forum.devmedia.com.br/viewtopic.php?t=19507
[]´s
GOSTEI 0
Pfloyd_fan
27/04/2009
Obrigado pelo link, Barcelos.
Creio que me será muito útil!!!
Abraços!!!
Creio que me será muito útil!!!
Abraços!!!
GOSTEI 0
.lg.
27/04/2009
realmente, muito útil o link. está no quickyLinks do meu favoritos.
Barcelos, Me ajudou também.
Obrigado.
Abraços,
.lg.
Barcelos, Me ajudou também.
Obrigado.
Abraços,
.lg.
GOSTEI 0
Pfloyd_fan
27/04/2009
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!!!
------------------------------------------------------------------------------------
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!!!
GOSTEI 0
Pfloyd_fan
27/04/2009
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!!!
-----------------
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!!!
GOSTEI 0