Ir para conteúdo
Fórum Script Brasil
  • 0

Interceptando Teclas


Paulo Nobre

Pergunta

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;

Link para o comentário
Compartilhar em outros sites

6 respostass a esta questão

Posts Recomendados

  • 0

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.

Link para o comentário
Compartilhar em outros sites

  • 0

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.

Editado por Paulo Nobre
Link para o comentário
Compartilhar em outros sites

Participe da discussão

Você pode postar agora e se registrar depois. Se você já tem uma conta, acesse agora para postar com sua conta.

Visitante
Responder esta pergunta...

×   Você colou conteúdo com formatação.   Remover formatação

  Apenas 75 emoticons são permitidos.

×   Seu link foi incorporado automaticamente.   Exibir como um link em vez disso

×   Seu conteúdo anterior foi restaurado.   Limpar Editor

×   Você não pode colar imagens diretamente. Carregar ou inserir imagens do URL.



  • Estatísticas dos Fóruns

    • Tópicos
      152k
    • Posts
      651,8k
×
×
  • Criar Novo...