jun 272013
 

Buenas,

Haciendo una aplicación en la que se hace un cierto uso del TWebBrowser, me he encontrado de que éste no gestiona la tecla Enter, ni para aceptar un formulario cuando estamos en un Input tipo Text ni para añadir un salto de línea en un TextArea.

Buscando por internet he encontrado la solución en los foros de Embarcadero. No obstante, quiero poner aquí la solución al problema dado que me parece muy chocante que a estas alturas este problema con el TWebBrowser no esté solucionado.

Lo primero es poner a True la propiedad KeyPreview del formulario en el que mostramos el TWebBrowser. Ahora sólo nos basta con añadir estas pocas líneas de código en su evento OnKeyPress

procedure TForm1.FormKeyPress(Sender: TObject; var Key: Char);
begin
  if Key = #13 then
  begin
    keybd_event(VK_LCONTROL, 0, 0, 0);    //Ctrl key down
    keybd_event(Ord('M'), MapVirtualKey(Ord('M'), 0), 0, 0); // 'M' key down
    keybd_event(Ord('M'), MapVirtualKey(Ord('M'), 0), KEYEVENTF_KEYUP, 0); // 'M' Key up
    keybd_event(VK_LCONTROL, 0, KEYEVENTF_KEYUP, 0); // Ctrl key up
  end
end;

Con estas líneas de código, lo que simulamos es la pulsación de la combinación de teclas CTRL+M que, curiosamente, es la combinación de teclas que genera el “enter” tanto en el TextArea (añadiendo una línea) como en los Input tipo Text (aceptando el formulario). Para ello hacemos uso del API de Windows keybd_event definida en la unit Windows, la cual realiza una pulsación de una tecla. Cabe destacar que hay que realizar tanto la bajada de la tecla (pulsarla) como su subida (soltarla), de lo contrario esa tecla permanecería pulsada con los efectos que ya podéis imaginaros.

Otra API de Windows que se usa es MapVirtualKey para poder transformar un código “virtual-key” en un “scan code” y viceversa.

Pues nada, espero que os sirva.

Hasta la próxima entrada.

 Leave a Reply

You may use these HTML tags and attributes: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>

(required)

(required)