19
May 08

Delphi: RegisterHotkey

:: articles :: by Gilberto Saraiva

Camaradas,

O RegisterHotkey e uma função disponibilizada pela plataforma Windows ( API ) que cria uma interação com o objeto passado como parametro no momento que o usuário faz uma combinação de teclas, exemplo: CTRL+X. Resumindo, ele registra um objeto para ser notificado quando uma combinação de teclas é acionada.

 Delphi |  copy code |? 
1
{$EXTERNALSYM RegisterHotKey}
2
function RegisterHotKey(hWnd: HWND; id: Integer; fsModifiers, vk: UINT): BOOL; stdcall;

O 1º parametro é o Handle do objeto que receberá a notificação quando a combinação de teclas selecionada for feita.
O 2º parametro é um indice controlado pelo programador afim de possibilitar mais de um registro de combinação de teclas.
O 3º e o 4º parametro são aonde o programador passa qual a combinação de teclas ele quer monitorar.

Exemplo:

 Delphi |  copy code |? 
1
2
  RegisterHotkey(form1.Handle, 1, MOD_CONTROL or MOD_SHIFT, Byte(Ord('Q')));
3
  RegisterHotkey(form1.Handle, 2, MOD_CONTROL or MOD_SHIFT, Byte(Ord('A')));
4

Aqui eu registro para o TForm form1 o recebimento da notificação no caso de CTRL+SHIFT+Q e CTRL+SHIFT+A.

Mas ainda falta uma coisa, como já sabemos objetos Windows são notificados através de mensagens ( Message ) então temos que gerenciar a mensagem certa que o Windows utiliza para notificar o objeto quando a combinação de teclas é feita. Essa mensagem é a WM_HOTKEY, uma mensagem que o Delphi já mapeia para você como TWMHotKey, então é só escrever o seguinte código para gerenciar as notificações:

 Delphi |  copy code |? 
1
2
type
3
  TForm1 = class(TForm)
4
  private
5
    { Private declarations }
6
  public
7
    procedure WMHotKey(var Msg: TWMHotKey); message WM_HOTKEY;
8
  end;
9

E no procedimento separa através da propriedade HotKey da var Msg

Exemplo:

 Delphi |  copy code |? 
01
procedure TForm1.WMHotKey(var Msg: TWMHotKey);
02
begin
03
  case Msg.HotKey of
04
    1: begin
05
      // Aqui eu recebi CTRL+SHIFT+Q
06
    end;
07
    2: begin
08
      // Aqui eu recebi CTRL+SHIFT+A
09
    end;
10
  end;
11
end;

É muito simples a utilização da API RegisterHotkey, outra parte interessante é a possibilidade de desregistrar a notificação, através da contra-API UnRegisterHotkey.

 Delphi |  copy code |? 
1
{$EXTERNALSYM UnregisterHotKey}
2
function UnregisterHotKey(hWnd: HWND; id: Integer): BOOL; stdcall;

Baseando no nosso exemplo, desregistramos as 2 notificações assim:

 Delphi |  copy code |? 
1
2
  UnRegisterHotkey(Handle, 1);
3
  UnRegisterHotkey(Handle, 2);
4

Simples não é?
Qualquer dúvida fique avontade em perguntar.

Abraço a todos

Tags: , , , ,


4 comments

  1. Oi blz?
    Valeu muito : D
    No meu joguinho serviu pra fazer meu console de cheat aparecer com ctrl+K;
    Muito legal ;)

  2. Opa, blz?

    Mto bacana seu site.

    Minha dúvida é: tô tentando utilizar o register hotkey mas instruir o delphi a pular para a página seguinte.

    Qual seria a instrução correta?

    Abraços!

  3. Olá, blz?
    Mto boas as explicações.

    Mas minha dúvida é:

    Preciso utilizar no meu projeto as teclas + O para passar para a página seguinte. Isso acontece umas três vezes durante o projeto.

    Mas não estou conseguindo, pois, quando utilizo a primeira vez, e vou utilizar pela segunda, ele volta na página da primeira utilização.

    Dá um help aí.

    Abraços…

  4. Olá Leandro,

    Muito sutíl a pergunta, mas vou tentar responder:

    tu deve usar no hotkey:

     Delphi |  copy code |? 
    1
      RegisterHotkey(Handle, 1, MOD_CONTROL, VK_ADD);

    e no receptor da WM_HOTKEY:

     Delphi |  copy code |? 
    1
    procedure TForm1.WMHotKey(var Msg: TWMHotKey);
    2
    begin
    3
      case Msg.HotKey of
    4
        1: begin
    5
          PageControl1.ActivePageIndex := PageControl1.ActivePageIndex + 1;
    6
        end;
    7
      end;
    8
    end;

    Sendo que PageControl1 é (pelo que eu entendi da pergunta) seu controlador de página.

Leave a comment