Jump to content


Photo

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


  • Please log in to reply
No replies to this topic

#1 escafandra

escafandra

    Advanced Member

  • Administrador
  • 4107 posts
  • LocationMadrid - España

Posted 26 April 2010 - 03:43 PM

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:

delphi
  1. procedure Keyb_Event(C: CHAR);
  2. var
  3.   S: WORD;
  4. begin
  5.  
  6.   S:=  VkKeyScan(C);
  7.   if(S and $0100) <> 0 then keybd_event(VK_SHIFT,0,0,0);
  8.   if(S and $0200) <> 0 then keybd_event(VK_LCONTROL,0,0,0);
  9.   if(S and $0400) <> 0 then keybd_event(VK_LMENU,0,0,0);
  10.  
  11.   keybd_event(S,0,0,0);
  12.   keybd_event(S,0,KEYEVENTF_KEYUP,0);
  13.  
  14.   if(S and $0100) <> 0 then keybd_event(VK_SHIFT,0,KEYEVENTF_KEYUP,0);
  15.   if(S and $0200) <> 0 then keybd_event(VK_LCONTROL,0,KEYEVENTF_KEYUP,0);
  16.   if(S and $0200) <> 0 then keybd_event(VK_LMENU,0,KEYEVENTF_KEYUP,0);
  17.  
  18. end;

o su versión en C:

cpp
  1. Keyb_Event(char C)
  2. {
  3.   WORD S =  VkKeyScan(C);
  4.   if(S & 0x0100)  keybd_event(VK_SHIFT,0,0,0);
  5.   if(S & 0x0200)  keybd_event(VK_LCONTROL,0,0,0);
  6.   if(S & 0x0400)  keybd_event(VK_LMENU,0,0,0);
  7.  
  8.   keybd_event(S,0,0,0);
  9.   keybd_event(S,0,KEYEVENTF_KEYUP,0);
  10.  
  11.   if(S & 0x0100)  keybd_event(VK_SHIFT,0,KEYEVENTF_KEYUP,0);
  12.   if(S & 0x0200)  keybd_event(VK_LCONTROL,0,KEYEVENTF_KEYUP,0);
  13.   if(S & 0x0400)  keybd_event(VK_LMENU,0,KEYEVENTF_KEYUP,0);
  14.  
  15. }

El ejemplo de uso:

delphi
  1. Keyb_Event('@');

Si experimentamos sobre un control TEdit:

delphi
  1. procedure TForm1.Button1Click(Sender: TObject);
  2. begin
  3.   Edit1.SetFocus();
  4.   Keyb_Event('@');
  5. end;

Que os sea de utilidad.

Saludos.
  • 0




IP.Board spam blocked by CleanTalk.