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
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:
cpp
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:
delphi
Keyb_Event('@');
Si experimentamos sobre un control TEdit:
delphi
procedure TForm1.Button1Click(Sender: TObject); begin Edit1.SetFocus(); Keyb_Event('@'); end;
Que os sea de utilidad.
Saludos.