Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   API de Windows (https://www.clubdelphi.com/foros/forumdisplay.php?f=7)
-   -   Devolver Foco a una aplicación creada con ShellExecuteEx (https://www.clubdelphi.com/foros/showthread.php?t=73520)

gluglu 28-04-2011 18:07:36

Devolver Foco a una aplicación creada con ShellExecuteEx
 
Hola !

Abro una nueva aplicación con ShellExecuteEx a través de un TShellExecuteInfo y si no estoy errado, debería poder obtener el Handle de la aplicación recién creada con el valor hProcess, no ??

Código Delphi [-]
procedure TForm.LabelClick(Sender: TObject);
var
  ExecInfo    : TShellExecuteInfo;
begin
 
  Screen.Cursor := crHourGlass;
  ExecInfo.cbSize       := SizeOf(ExecInfo);
  ExecInfo.fMask        := SEE_MASK_NOCLOSEPROCESS;
  ExecInfo.Wnd          := Handle;
  ExecInfo.lpVerb       := 'open';
  ExecInfo.lpFile       := PChar('PaginaWeb');
  ExecInfo.lpParameters := nil;
  ExecInfo.lpDirectory  := nil;
  ExecInfo.nShow        := SW_SHOW;
 
  ShellExecuteEx(@ExecInfo);
  Aux_Handle := ExecInfo.hProcess;
  WaitForSingleObject(ExecInfo.hProcess, INFINITE);
 
  ... después sigo con otros comandos.

La variable Aux_Handle debería contener el Handle del Browser de internet que esté configurado por defecto en el sistema y que acabo de abrir.

Lo que quiero conseguir es que más tarde, cuando se devuelva el foco a mi aplicación Delphi, se realicen una serie de operaciones y finalmente se devuelva el foco a la ventana del browser que acabo de abrir.

Para ello utilizo el evento OnActivate del Form en cuestión que previamente puse en otro sitio a Form.OnActivate := Form.ActivateParticular :

Código Delphi [-]
procedure TForm.ActivateParticular(Sender: TObject);
begin
  Self.OnActivate := nil;
  SendMessage(Aux_Handle, WM_SETFOCUS, 0, 0);
end;

Pero no me devuelve el foco a la ventana del explorador de internet anterior.

Qué estoy haciendo mal ? :confused:

escafandra 29-04-2011 08:21:26

El problema está en que ExecInfo.hProcess es el Handle del proceso, no de la ventana principal. Ten en cuenta que no todos los procesos tienen ventanas.
Deberás enumerar las ventanas para encontrar la que te interesa contrastando con tu proceso (hProcess o Pid).

Tambien puedes tratar de encontrarla con FindWindow.

Saludos.

gluglu 29-04-2011 09:46:29

Gracias por responder, voy a mirar lo que comentas.

El problema de FindWindow es que necesito saber qué ventana debo de buscar, y lo que quiero abrir con el proceso indicado, es un explorador de internet, cualquier que esté configurado por defecto en el sistema. Podría mirar cual está configurado por defecto, y después también mirar si existen varias copias abiertas del mismo, pero pensaba que con ShellExecuteEx sería capaz de obtener sin más, el handle de la ventana que acababa de abrir.

Lo que sí he podido chequear, es que ExecInfo.hProcess es siempre 0 en el caso de que ejecute el código indicado. Realmente no sé por qué es así.

roman 29-04-2011 16:53:37

Cita:

Empezado por gluglu (Mensaje 398340)
Lo que sí he podido chequear, es que ExecInfo.hProcess es siempre 0 en el caso de que ejecute el código indicado. Realmente no sé por qué es así.

¡Uf! La tienes complicada. Esto dice la documentación:

Cita:

hProcess

A handle to the newly started application. This member is set on return and is always NULL unless fMask is set to SEE_MASK_NOCLOSEPROCESS. Even if fMask is set to SEE_MASK_NOCLOSEPROCESS, hProcess will be NULL if no process was launched. For example, if a document to be launched is a URL and an instance of Internet Explorer is already running, it will display the document. No new process is launched, and hProcess will be NULL.
// Saludos

escafandra 29-04-2011 22:10:46

Tal como te comenta Roman, quizás debas forzar que se abra un proceso nuevo si o si. Yo usaría CreateProcess.

Saludos.


La franja horaria es GMT +2. Ahora son las 01:40:13.

Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi