Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Principal > API de Windows
Registrarse FAQ Miembros Calendario Guía de estilo Temas de Hoy

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 28-04-2011
Avatar de gluglu
[gluglu] gluglu is offline
Miembro Premium
 
Registrado: sep 2004
Ubicación: Málaga - España
Posts: 1.455
Poder: 21
gluglu Va por buen camino
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 ?
__________________
Piensa siempre en positivo !
Responder Con Cita
  #2  
Antiguo 29-04-2011
Avatar de escafandra
[escafandra] escafandra is offline
Miembro Premium
 
Registrado: nov 2007
Posts: 2.197
Poder: 20
escafandra Tiene un aura espectacularescafandra Tiene un aura espectacular
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.

Última edición por escafandra fecha: 29-04-2011 a las 08:27:17.
Responder Con Cita
  #3  
Antiguo 29-04-2011
Avatar de gluglu
[gluglu] gluglu is offline
Miembro Premium
 
Registrado: sep 2004
Ubicación: Málaga - España
Posts: 1.455
Poder: 21
gluglu Va por buen camino
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í.
__________________
Piensa siempre en positivo !
Responder Con Cita
  #4  
Antiguo 29-04-2011
Avatar de roman
roman roman is offline
Moderador
 
Registrado: may 2003
Ubicación: Ciudad de México
Posts: 20.269
Poder: 10
roman Es un diamante en brutoroman Es un diamante en brutoroman Es un diamante en bruto
Cita:
Empezado por gluglu Ver Mensaje
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
Responder Con Cita
  #5  
Antiguo 29-04-2011
Avatar de escafandra
[escafandra] escafandra is offline
Miembro Premium
 
Registrado: nov 2007
Posts: 2.197
Poder: 20
escafandra Tiene un aura espectacularescafandra Tiene un aura espectacular
Tal como te comenta Roman, quizás debas forzar que se abra un proceso nuevo si o si. Yo usaría CreateProcess.

Saludos.
Responder Con Cita
Respuesta



Normas de Publicación
no Puedes crear nuevos temas
no Puedes responder a temas
no Puedes adjuntar archivos
no Puedes editar tus mensajes

El código vB está habilitado
Las caritas están habilitado
Código [IMG] está habilitado
Código HTML está deshabilitado
Saltar a Foro

Temas Similares
Tema Autor Foro Respuestas Último mensaje
Distribuir una Aplicacion creada con Delphi 2007 y Firebird. Adrian Murua Firebird e Interbase 2 18-05-2008 16:13:01
Devolver foco desde Form No Modal al control llamante gluglu Varios 8 22-06-2007 08:35:41
Aplicacion creada en Delphi 6 WindowsMe no funciona en WindowsXP Jgarmel Conexión con bases de datos 5 16-07-2006 19:16:26
Devolver el foco a aplicacion Coco_jac Varios 2 13-10-2005 16:38:33
instalador de una aplicación creada con delphi emeceuy Varios 1 03-06-2003 07:55:42


La franja horaria es GMT +2. Ahora son las 17:10:25.


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
Copyright 1996-2007 Club Delphi