Simulando KeyPress com PostKeyEx32.
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);

Leave a Reply