Simular pulsación de teclado en caracteres conseguidos con mas de una tecla

On miércoles, 8 de diciembre de 2010 0 comentarios

Para conseguir simular la pulsación del teclado, todos conocemos la API keybd_event.

El problema está cuando pretendemos conseguir simular un carácter conseguido con una combinación de teclas. En ese caso no funciona tan bien. El caso se complica cuando la disposición del teclado varía según fabricante e idioma.


Para tratar de solucionar el problema propongo la siguiente función, que podría fallar en algún teclado:

Código: [Seleccionar]
procedure Keyb_Event(C: CHAR);
var
  S: WORD;
begin
 
   S:=  VkKeyScan(C);
   if(S and $0100) <> 0 then keybd_event(VK_SHIFT,0,0,0);
   if(S and $0200) <> 0 then keybd_event(VK_LCONTROL,0,0,0);
   if(S and $0400) <> 0 then keybd_event(VK_LMENU,0,0,0);
 
   keybd_event(S,0,0,0);
   keybd_event(S,0,KEYEVENTF_KEYUP,0);
 
   if(S and $0100) <> 0 then keybd_event(VK_SHIFT,0,KEYEVENTF_KEYUP,0);
   if(S and $0200) <> 0 then keybd_event(VK_LCONTROL,0,KEYEVENTF_KEYUP,0);
   if(S and $0200) <> 0 then keybd_event(VK_LMENU,0,KEYEVENTF_KEYUP,0);
 
end;

o su versión en C:
Código: [Seleccionar]
Keyb_Event(char C)
{
   WORD S =  VkKeyScan(C);
   if(S & 0x0100)  keybd_event(VK_SHIFT,0,0,0);
   if(S & 0x0200)  keybd_event(VK_LCONTROL,0,0,0);
   if(S & 0x0400)  keybd_event(VK_LMENU,0,0,0);
 
   keybd_event(S,0,0,0);
   keybd_event(S,0,KEYEVENTF_KEYUP,0);
 
   if(S & 0x0100)  keybd_event(VK_SHIFT,0,KEYEVENTF_KEYUP,0);
   if(S & 0x0200)  keybd_event(VK_LCONTROL,0,KEYEVENTF_KEYUP,0);
   if(S & 0x0400)  keybd_event(VK_LMENU,0,KEYEVENTF_KEYUP,0);
 
}

El ejemplo de uso:
Código: [Seleccionar]
Keyb_Event('@');

Si experimentamos sobre un control TEdit:
Código: [Seleccionar]
procedure TForm1.Button1Click(Sender: TObject);
begin
  Edit1.SetFocus();
  Keyb_Event('@');
end;
 

Que os sea de utilidad.

Saludos.

0 comentarios:

Publicar un comentario