Sign in to follow this  
Paulo Nobre

Interceptando Teclas

Recommended Posts

Tenho um programa ainda em andamento que captura screens, janelas ativas etc...

Só que ele é meio instável.

Quando abro e mando capturar em qualquer condição funciona bem, mas quando minimizo e tento capturar, com a tecla print, as vezes captura as vezes não.

Alguém poderia dar uma olhada nos códigos e ver o que pode estar causando a instabilidade.

A tecla está registrada e aparece da seguinte maneira:

{ Private declarations }
procedure WMHotKey(var Msg: TWMHotKey); message WM_HOTKEY;
No OnCreat do Form tenho
{== Desabilita a tecla Print Screen ==}
  RegisterHotkey( Handle, 500, 0, VK_SNAPSHOT );
tenho também
procedure TfrmPrincipal.WMHotKey (var Msg : TWMHotKey);
begin
  if Msg.HotKey = 500 then
  begin
    {== Habilita a tecla Print Screen ==}
    //Se não colocar cria um looping
    UnRegisterHotkey( Handle, 500 );

    reg.RootKey:=HKEY_LOCAL_MACHINE;
    reg.OpenKey('SOFTWARE\NOBRE INFORMÁTICA\FLASH',FALSE);
    If reg.ReadString('Capturar')= 'A tela toda' then
      begin
        Clipboard.Clear;//Se não colocar dá erro
        Keybd_Event(VK_Snapshot,0, 0, 0);
        reg.CloseKey;
        {== Desabilita a tecla Print Screen ==}
        RegisterHotkey( Handle, 500, 0, VK_SNAPSHOT );
      end
    Else If reg.ReadString('Capturar')= 'A janela ativa' then
      begin
        Clipboard.Clear;//Se não colocar dá erro
        Keybd_Event(VK_Snapshot,1, 0, 0);
        reg.CloseKey;
        {== Desabilita a tecla Print Screen ==}
        RegisterHotkey( Handle, 500, 0, VK_SNAPSHOT );
      end
    Else If reg.ReadString('Capturar')= 'Parte da Tela' then
      begin
        reg.CloseKey;
        TimerParteDaTela.Enabled:= True;
      end;
    Timer1.Enabled:=True;//Aciona a captura
   end;
end;
Não entendo porque não pode ficar
procedure TfrmPrincipal.WMHotKey (var Msg : TWMHotKey);
begin
  if Msg.HotKey = 500 then
  begin

    reg.RootKey:=HKEY_LOCAL_MACHINE;
    reg.OpenKey('SOFTWARE\NOBRE INFORMÁTICA\FLASH',FALSE);
    If reg.ReadString('Capturar')= 'A tela toda' then
      begin
        Clipboard.Clear;//Se não colocar dá erro
        Keybd_Event(VK_Snapshot,0, 0, 0);
        reg.CloseKey;
      end
    Else If reg.ReadString('Capturar')= 'A janela ativa' then
      begin
        Clipboard.Clear;//Se não colocar dá erro
        Keybd_Event(VK_Snapshot,1, 0, 0);
        reg.CloseKey;
      end
    Else If reg.ReadString('Capturar')= 'Parte da Tela' then
      begin
        reg.CloseKey;
        TimerParteDaTela.Enabled:= True;
      end;
    Timer1.Enabled:=True;//Aciona a captura
   end;
end;
Apesar de já ter registrado no oncreate, se tirar: {== Habilita a tecla Print Screen ==} //Se não colocar cria um looping UnRegisterHotkey( Handle, 500 ); {== Desabilita a tecla Print Screen ==} RegisterHotkey( Handle, 500, 0, VK_SNAPSHOT ); O programa entra em looping. Alguém tem alguma idéia do que estou fazendo de errado? Ao minimizar as vezes funciona as vezes não. Para minimizar estou usando o seguinte código:
procedure TfrmPrincipal.WMSysCommand(var Msg: TWMSysCommand);
Var
  H : HWnd;
begin
inherited;
if (Msg.CmdType = SC_MINIMIZE) then
    begin
      If reg.ReadString('Timer')='Sim' then
        begin
          frmConfig.cmdPararCaptura.ShowHint:= True;
          frmConfig.cmdPararCaptura.Enabled:= True;
          frmConfig.TimerCaptura.Interval:= 60000*reg.ReadInteger('Segundos');
          frmConfig.TimerCaptura.Enabled:= True;
        end;
      //O código abaixo esconde a aplicação da barra
      // de tarefas.
      H := FindWindow(Nil,'FLASH');
      If H <> 0 then ShowWindow(H,SW_HIDE);
      frmPrincipal.Hide;
      frmPrincipal.RxTrayIcon1.Active := True;

      {== Desabilita a tecla Print Screen ==}
        RegisterHotkey( Handle, 500, 0, VK_SNAPSHOT );
    end;

if (Msg.CmdType = SC_CLOSE) then
    begin
      Application.Terminate;
    end;
end;

Share this post


Link to post
Share on other sites

Gostaria de lembrar que eu escreví esse programa para finalidades específicas, então o retangulo que ele captura da tela só é capturado quando a resolução é maior ou igual a 1024 * 768.

Share this post


Link to post
Share on other sites

Thales, resolvi dando uma enxugada no código.

Estava colocando coisas repetidas demais e erradas dentro do evento timer.

Estou testando e até agora não deu mais problemas.

Na realidade estava esquecendo que que a função Keybd_Event(VK_Snapshot,0, 0, 0);

faz uma chamada a tecla printscreen e isso estava fazendo a diferença no meu raciocínio e levando ao

looping infinito.

Agora estou precisando da seguinte ajuda:

Alguém disse que gostaria que no programa ao capturar a tela toda

Keybd_Event(VK_Snapshot,0, 0, 0);

Ou a janela ativa

Keybd_Event(VK_Snapshot,1, 0, 0);

gostaria de ter a opção da seta do mouse aparecer ou não.

Acontece que as funções acima

Keybd_Event(VK_Snapshot,0, 0, 0);

Keybd_Event(VK_Snapshot,1, 0, 0);

Capturam sem a seta.

Tem como ter estas duas opções usando estas funções?

Existe um código por aí, que captura com o sem, mas não faz uso destas funções!

Teria como fazer isto usando elas?

A propósito será que tem alguma coisa a ver com os parametros da função...

Não sei o que significam o terceiro(0) e o quarto parâmetro(0) das funções acima.

Alguém sabe?

Como este tópico está com um título que não tem muito a ver com está nova pergunta vou abrir um outro com a mesma pergunta.

Edited by Paulo Nobre

Share this post


Link to post
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

Sign in to follow this