Esta  semana eu resolvi adicionar a simulação de KeyPress em um aplicativo, precisava simular o “CTRL + F10″ e enviar uma mensagem WM_HOTKEY.

Para minha surpresa, não era uma tarefa tão simples de codificar, e depois de várias tentativas, consegui enviar o “CTRL + F10″, só que outro aplicativo que tinham registrado F10 também era executado, alterei os parametros e ai o diálogo executar do windows também era executado, e a tecla de atalho para ele é “Tecla Windows + R”, que não tem nada a ver com o “CTRL + F10″, que eu estava enviando.

Postei a dúvida no Stackoverflow, mas logo em seguida encontrei a solução definitiva, a função PostKeyEx32, a qual vou adicionar neste artigo por que é pequena, e também vou explicar como utilizar.

procedure PostKeyEx32(key: Word; const shift: TShiftState;
  specialkey: Boolean);
type
  TShiftKeyInfo = record
    shift: Byte;
    vkey: Byte;
  end;
  byteset = set of 0..7;
const
  shiftkeys: array [1..3] of TShiftKeyInfo =
    ((shift: Ord(ssCtrl); vkey: VK_CONTROL),
    (shift: Ord(ssShift); vkey: VK_SHIFT),
    (shift: Ord(ssAlt); vkey: VK_MENU));
var
  flag: DWORD;
  bShift: ByteSet absolute shift;
  i: Integer;
begin
  for i := 1 to 3 do
  begin
    if shiftkeys[i].shift in bShift then
      keybd_event(shiftkeys[i].vkey,
        MapVirtualKey(shiftkeys[i].vkey, 0), 0, 0);
  end; { For }
  if specialkey then
    flag := KEYEVENTF_EXTENDEDKEY
  else
    flag := 0;
  keybd_event(key, MapvirtualKey(key, 0), flag, 0);
  flag := flag or KEYEVENTF_KEYUP;
  keybd_event(key, MapvirtualKey(key, 0), flag, 0);
  for i := 3 downto 1 do
  begin
    if shiftkeys[i].shift in bShift then
      keybd_event(shiftkeys[i].vkey,
        MapVirtualKey(shiftkeys[i].vkey, 0), KEYEVENTF_KEYUP, 0);
  end; { For }
end; { PostKeyEx32 }

Utilizando a função PostKey32

Parâmetros

Key: Código virtual das teclas a simular. Para caracteres imprimíveis utilize o código ansi, (Ord(Caracter)).

Shift: Estado das teclas modificadoras. ?? um conjunto para que se possa passar mais de uma tecla (Shift, Control, Alt, Botões do Mouse). TShiftState é declarado na unit Classes.

SpecialKey: Normalmente deve ser Falso. Defina como Verdadeiro para especificar uma tecla no teclado númerico, por exemplo.

Descrição

PostKeyEx32 utiliza keybd_evet para criar uma série de eventos de teclas que combinem com os parâmetros passados. Os eventos serão enviados para o componente/controle em que esteja com o foco.

Para teclas de caracteres, utilize sempre a versão em maiúsculo. Enviando sem nenhum modificador, o resultado será sempre um caracter minúsculo, enviando com [ssShift] o resultado será maiúsculo.

Utilizando PostKeyEx32, o código para simular “CTRL + F10″ ficou bem simples


  PostKeyEx32(VK_F10, [ssCtrl], False);
Bookmark and Share: