Ir al contenido


Foto

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


  • Por favor identifícate para responder
No hay respuestas en este tema

#1 escafandra

escafandra

    Advanced Member

  • Administrador
  • 4.107 mensajes
  • LocationMadrid - España

Escrito 26 abril 2010 - 03:43

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.