PDA

Ver la Versión Completa : Mandar teclas a otra aplicación de windows


juank1971
25-07-2012, 18:31:34
Saludos esto usando esta función:


procedure TForm1.Button1Click(Sender: TObject);
var
hwndotrapp: THandle;
begin
hwndotrapp := Windows.FindWindow(nil,'index.html - Google Chrome');
if hwndotrapp > 0 then
begin
SetForegroundWindow(hwndotrapp); // Cambia el foco
keybd_event(VK_F5, 0, 0, 0);

// SetForegroundWindow(Handle); // Cambia el foco

end;

end;


Para mandar a refrescar el navegador cuando lo necesite y lo realiza sin problemas pero con la linia SetForegroundWindow(Handle); comentada, cuando la descomento me retorna el foco sin problemas a mi aplicaion pero no realiza el envío de la tecla, cuando comento esa linea me realiza sin problemas lo que necesito en el navegador que esta en la otra ventana pero no me rotorna el foco a mi aplicacion como es logico.

alguna idea???

Lo que estoy haciendo es un editor visual de HTML5 y CSS, he tratado de usar el webbrowser pero el internet explorer esta muy atrás con referencia a otros navegadores , he probado con el Chrome Frame y mejora un poco el TWebBrowser, pero no es suficiente para todo lo necesario del html5.

Entonces me fui por la via de hacer los cambios necesarios y mandar a refrescar el navegador desde delphi y me sucede ese problema.

Gracias
salud y pesetas Juank
Uso delphi XE con windows seven

juank1971
25-07-2012, 18:33:49
probe de esta otra manera que vi tambien en estos foros pero me hace lo mismo

cuando le pongo la funcion que retorna el foco no ejecuta la tecla enviada


procedure TForm1.Button2Click(Sender: TObject);
var hw:integer;
begin
hw:=findwindow(nil,'t.html - Google Chrome');
if hw>0 then
postmessage(hw,VK_F5,97,0);

// SetForegroundWindow(hw); // Cambia el foco
end;

roman
25-07-2012, 19:07:22
Intenta poner un Application.ProcessMessages antes del segundo SetForegroundWindow.

// Saludos

roman
25-07-2012, 19:21:13
Lo que estoy haciendo es un editor visual de HTML5 y CSS, he tratado de usar el webbrowser pero el internet explorer esta muy atrás con referencia a otros navegadores , he probado con el Chrome Frame y mejora un poco el TWebBrowser, pero no es suficiente para todo lo necesario del html5.

Hay un webbrowser basado en google chromium (http://code.google.com/p/chromiumembedded/) con soporte para delphi (http://code.google.com/p/delphichromiumembedded/). En el hilo Usar chromium dentro del aplicativo (http://clubdelphi.com/foros/showthread.php?t=70348&highlight=chrome) se habla del componente y como instalarlo.

// Saludos

juank1971
25-07-2012, 20:21:13
Gracias roman:

Pero no me funciona con el proccessmasage.
sin embargo probe los dos procedimientos juntos y si funciona, el diablo son las cosas.


procedure TForm1.Button2Click(Sender: TObject);
var hw:thandle;
hwndotrapp: integer;
begin
hwndotrapp := Windows.FindWindow(nil,'index.html - Google Chrome');
if hwndotrapp > 0 then
begin
SetForegroundWindow(hwndotrapp); // Cambia el foco
keybd_event(VK_F5, 0, 0, 0);

SetForegroundWindow(Handle); // Cambia el foco
end;

hw:=findwindow(nil,'index.html - Google Chrome');
if hw>0 then
// postmessage(hw,VK_F5,97,0);
PostMessage(hw, WM_KEYDOWN, VK_F5, 0);
memo1.setfocus;
end;



con esto edito y el navegador se refresca cuando deceo y me devuelve el cursor al editor de nuevo.

Gracias por la respuesta, lo que me comentas en el lugar donde me encuentro ahora no puedo hacer el download en ese lugar de google.

Lo del chromium, no lo he probado, pero pienso que debe tener lo mismo que chrome frame que mejora considerablemente el twebbrowser pero no llega a tener todo lo necesario para html5 como el mismo chrome.
Fíjate le puse el ie la ultima versión de Chrome Frame y no llega a verse el sitio en html5 en IE igual que en el google chrome verdadero.
la versión de Chrome Frame es la misma 20 y el google chrome también es la 20.

Gracias muchas si alguno quiere usar lo antes comentado como mejor me resulto fue poniendo los dos procedimientos.

salud y pesetas

ecfisa
25-07-2012, 20:58:50
Para mandar a refrescar el navegador cuando lo necesite y lo realiza sin problemas pero con la linia SetForegroundWindow(Handle); comentada, cuando la descomento me retorna el foco sin problemas a mi aplicaion pero no realiza el envío de la tecla, cuando comento esa linea me realiza sin problemas lo que necesito en el navegador que esta en la otra ventana pero no me rotorna el foco a mi aplicacion como es logico.

Hola juank1971.

Intenta de este modo:

procedure TForm1.Button1Click(Sender: TObject);
var
H: HWND;
begin
H := FindWindow(nil, 'Club Delphi - Mozilla Firefox');
if H <> 0 then
begin
SetForegroundWindow(H);
EnableWindow(H, False);
keybd_event(VK_F5, 0, WM_KEYDOWN, 0);
EnableWindow(H, True);
SetForegroundWindow(Handle);
end;
end;


Saludos.

roman
25-07-2012, 21:12:55
Lo del chromium, no lo he probado, pero pienso que debe tener lo mismo que chrome frame que mejora considerablemente el twebbrowser pero no llega a tener todo lo necesario para html5 como el mismo chrome.


El sitio del chromium embedded dice:

The host application can optionally control resource loading, navigation, context menus, printing and more, while taking advantage of the same performance and HTML5 technologies available in the Google Chrome Web browser.

O sea, que debe funcionar igual que el navegador. ¿Puedes poner la dirección de alguna página que se vea bien en el navegador Chrome y no en IE con el Chome Frame?

// Saludos

juank1971
28-07-2012, 15:26:49
ecfisa, mis saludos si, lo que me madaste si funciona, yo tenia mal algunas cosas , y román no había probado lo del chromium, lo que había probado era lo del chrome frame y ese es el que me dio diferente, al igual que el componente Motzilla controls con el ActiveX para Motzilla,ese también me da muy diferente al navegador Motzilla que tengo instalado.

Pero ya baje lo de Chromium y el componente para delphi y estas en lo cierto román , ese si funciona perfectamente bien.

muchas gracias por el aporte .

salud y pesetas para todos

Juank