Sign in Join

Live chat for Free Pascal, Lazarus, Delphi and every Pascal programmer.

Mailing lists / lazarus-es / 2013-07

TProcess Handle

11 messages · 6 people · –

Reply by email Subscribe to this list Your subscription

Read-only archive. Use j and k to move between messages.

Antonio Évora

Hola a todos,
Ejecuto una aplicacion externa usando TProcess, pero necesito saber el Handle que el sistema le asingno a ese proceso externo.

Por ejemplo, lanzo la calculadora de windows,su hwnd es 1049082 (resultado de llamar a FindWindow en las pruebas que estoy haciendo) y no hay correspondencia con ninguna de las propiedades del TProcess, las propiedadees candidatas (ProcessID, ThreadID, ProcessHandle, ThreadHandle o Handle) no contienen ningun valor que se parezca al capturado por FindWindow.

�Como puedo saberlo?

Un saludo y gracias de antemano

Reply by email

José Mejuto
to Antonio Évora

El 31/07/2013 14:44, Antonio �vora escribi�:

Show quoted text 11 lines
Hola a todos, Ejecuto una aplicacion externa usando TProcess, pero necesito saber el Handle que el sistema le asingno a ese proceso externo. Por ejemplo, lanzo la calculadora de windows,su hwnd es 1049082 (resultado de llamar a FindWindow en las pruebas que estoy haciendo) y no hay correspondencia con ninguna de las propiedades del TProcess, las propiedadees candidatas (ProcessID, ThreadID, ProcessHandle, ThreadHandle o Handle) no contienen ningun valor que se parezca al capturado por FindWindow. �Como puedo saberlo?

Hola,

No puedes :( Un proceso puede lanzar m�ltiples "windows", por lo tanto lo �nico que puedes hacer es, usando el ThreadHandle, enumerar todas las ventanas de ese proceso, y de alg�n modo elegir la que quieres.

Reply by email

Antonio Évora
to José Mejuto

El 31/07/13 15:16, Jos� Mejuto escribi�:

Show quoted text 19 lines
El 31/07/2013 14:44, Antonio �vora escribi�: > Hola a todos, > Ejecuto una aplicacion externa usando TProcess, pero necesito saber el > Handle que el sistema le asingno a ese proceso externo. > Por ejemplo, lanzo la calculadora de windows,su hwnd es 1049082 > (resultado de llamar a FindWindow en las pruebas que estoy haciendo) y > no hay correspondencia con ninguna de las propiedades del TProcess, las > propiedadees candidatas (ProcessID, ThreadID, ProcessHandle, > ThreadHandle o Handle) no contienen ningun valor que se parezca al > capturado por FindWindow. > �Como puedo saberlo? > Hola, No puedes :( Un proceso puede lanzar m�ltiples "windows", por lo tanto lo �nico que puedes hacer es, usando el ThreadHandle, enumerar todas las ventanas de ese proceso, y de alg�n modo elegir la que quieres.

Gracias Jos�.
Entiendo lo que me dices. Pero siempre debe haber un formulario/ventana/window principal, �como puedo saber cual es el principal?

Saludos.

Reply by email

José Mejuto
to Antonio Évora

El 01/08/2013 8:16, Antonio �vora escribi�:

Show quoted text 10 lines
> > No puedes :( Un proceso puede lanzar m�ltiples "windows", por lo tanto > lo �nico que puedes hacer es, usando el ThreadHandle, enumerar todas > las ventanas de ese proceso, y de alg�n modo elegir la que quieres. > Gracias Jos�. Entiendo lo que me dices. Pero siempre debe haber un formulario/ventana/window principal, �como puedo saber cual es el principal?

Hola,

No, no hay, ese es un concepto de Delphi. En mi opini�n lo m�ximo que puedes acercarte de modo gen�rico es lanzar el proceso, y entrar en un bucle esperando a que el proceso tenga alguna ventana abierta (EnumWindows) y usar la primera que aparezca. Lo malo es que si el programa tiene una ventana de presentaci�n (splash), esa es la que te comer�s :(

Por supuesto esto no es cross-platform, en Windows funciona pero lo dudo en otros SO.

EnumWindows devuelve los handles de las ventanas por Z-Order, o sea, primero la que se muestra por encima de las otras (dentro de ese proceso).

Reply by email

Martin Gomez
to José Mejuto

Perd�n Antonio, pero para que necesitas saber el Handle? Le piensas enviar mensajes de Windows con SendMessage o algo por el estilo? Si es s�lo para esperar a que el proceso termine, puedes usar la propiedad Options, agregando poWaitOnExit, o mirando la propiedad Running.

De acuerdo a la
documentaci�n<http://www.freepascal.org/docs-html/fcl/process/tprocess.html>, las propiedades Handle y ProcessHandle te devuelven el Handle al programa, el Hwnd es el Handle a la ventana, no al programa, y no estoy seguro que eso funcione fuera de Windows.

Saludos,
Mart�n

2013/8/1 Jos� Mejuto <joshyfun en gmail.com>

Show quoted text 35 lines
El 01/08/2013 8:16, Antonio �vora escribi�: >> No puedes :( Un proceso puede lanzar m�ltiples "windows", por lo tanto >> lo �nico que puedes hacer es, usando el ThreadHandle, enumerar todas >> las ventanas de ese proceso, y de alg�n modo elegir la que quieres. >> >> Gracias Jos�. > Entiendo lo que me dices. Pero siempre debe haber un > formulario/ventana/window principal, �como puedo saber cual es el > principal? > > Hola, No, no hay, ese es un concepto de Delphi. En mi opini�n lo m�ximo que puedes acercarte de modo gen�rico es lanzar el proceso, y entrar en un bucle esperando a que el proceso tenga alguna ventana abierta (EnumWindows) y usar la primera que aparezca. Lo malo es que si el programa tiene una ventana de presentaci�n (splash), esa es la que te comer�s :( Por supuesto esto no es cross-platform, en Windows funciona pero lo dudo en otros SO. EnumWindows devuelve los handles de las ventanas por Z-Order, o sea, primero la que se muestra por encima de las otras (dentro de ese proceso). -- ______________________________**_________________ Lazarus-es mailing list Lazarus-es en lists.lazarus.**freepascal.org<Lazarus-es en lists.lazarus.freepascal.org> http://lists.lazarus.**freepascal.org/mailman/**listinfo/lazarus-es<http://lists.lazarus.freepascal.org/mailman/listinfo/lazarus-es>
Try not to become a man of success but rather to become a man of value. *Albert Einstein* ------------ pr�xima parte ------------ Se ha borrado un adjunto en formato HTML... URL: <http://lists.lazarus.freepascal.org/pipermail/lazarus-es/attachments/20130801/5bb1b35d/attachment.html>

Reply by email

Antonio Evora
to Martin Gomez

Buenas,
Lo que necesito es empotrar una aplicaci�n externa dentro de un panel de mi aplicaci�n. Lo que se pretende es que desde mi aplicaci�n pueda lanzar distintas aplicaciones externas que se mostrar�n dentro de la m�a (a modo de panel de gesti�n). He conseguido realizarlo con �xito con el bloc de notas de Windows (la aplicaci�n solo debe correr en Windows, no es necesario que lo haga en otros sistemas) y con la calculadora. Esto lo consigo lanzando el proceso, espero un tiempo prudencial para dar tiempo a que muestre la ventana, la busco con findwindow y trabajo con ese handle (si quer�is os paso el c�digo de prueba). Lo que s� he notado que con aplicaciones m�s "complejas" (ventanas sin barra de t�tulo) el empotramiento falla, la semana que viene investigare un poco m�s y os contare avances. Cualquier informaci�n/aclaraci�n/orientaci�n ser� bienvenida.

Un saludete y bien fin de semana.

Enviado desde mi iPhone

El 02/08/2013, a las 01:27, Martin Gomez <mmgomez en gmail.com> escribi�:

Show quoted text 46 lines
Perd�n Antonio, pero para que necesitas saber el Handle? Le piensas enviar mensajes de Windows con SendMessage o algo por el estilo? Si es s�lo para esperar a que el proceso termine, puedes usar la propiedad Options, agregando poWaitOnExit, o mirando la propiedad Running. De acuerdo a la documentaci�n, las propiedades Handle y ProcessHandle te devuelven el Handle al programa, el Hwnd es el Handle a la ventana, no al programa, y no estoy seguro que eso funcione fuera de Windows. Saludos, Mart�n 2013/8/1 Jos� Mejuto <joshyfun en gmail.com> > El 01/08/2013 8:16, Antonio �vora escribi�: > >>> >>> No puedes :( Un proceso puede lanzar m�ltiples "windows", por lo tanto >>> lo �nico que puedes hacer es, usando el ThreadHandle, enumerar todas >>> las ventanas de ese proceso, y de alg�n modo elegir la que quieres. >> Gracias Jos�. >> Entiendo lo que me dices. Pero siempre debe haber un >> formulario/ventana/window principal, �como puedo saber cual es el >> principal? > > Hola, > > No, no hay, ese es un concepto de Delphi. En mi opini�n lo m�ximo que puedes acercarte de modo gen�rico es lanzar el proceso, y entrar en un bucle esperando a que el proceso tenga alguna ventana abierta (EnumWindows) y usar la primera que aparezca. Lo malo es que si el programa tiene una ventana de presentaci�n (splash), esa es la que te comer�s :( > > Por supuesto esto no es cross-platform, en Windows funciona pero lo dudo en otros SO. > > EnumWindows devuelve los handles de las ventanas por Z-Order, o sea, primero la que se muestra por encima de las otras (dentro de ese proceso). > > -- > > > _______________________________________________ > Lazarus-es mailing list > Lazarus-es en lists.lazarus.freepascal.org > http://lists.lazarus.freepascal.org/mailman/listinfo/lazarus-es -- Try not to become a man of success but rather to become a man of value. Albert Einstein _______________________________________________ Lazarus-es mailing list Lazarus-es en lists.lazarus.freepascal.org http://lists.lazarus.freepascal.org/mailman/listinfo/lazarus-es

------------ pr�xima parte ------------
Se ha borrado un adjunto en formato HTML...
URL: <http://lists.lazarus.freepascal.org/pipermail/lazarus-es/attachments/20130802/b5cd9659/attachment.html>

Reply by email

Rafael Bidegain
to Antonio Evora

Hola Antonio

El 2 de agosto de 2013 17:10, Antonio Evora <aevorar en gmail.com> escribi�:

Buenas, Lo que necesito es empotrar una aplicaci�n externa dentro de un panel de mi aplicaci�n.

Si es eso lo que necesitas te sugiero que veas esto: http://lists.lazarus.freepascal.org/pipermail/lazarus-es/2013-July/005428.html http://lists.lazarus.freepascal.org/pipermail/lazarus-es/2013-July/005439.html

A Edgar le funcion� y mostr� como lo hizo.

saludos

Rafael Bidegain Ya que los cuerdos no hablan, hablar� el loco. (The Fool, Padraic Pearse) # yo quiero educaci�n libre. �YA! ------------ pr�xima parte ------------ Se ha borrado un adjunto en formato HTML... URL: <http://lists.lazarus.freepascal.org/pipermail/lazarus-es/attachments/20130802/c6c2e068/attachment.html>

Reply by email

Rubén Ibáñez
to Antonio Evora: Lo que necesito es empotrar una aplicaci�n externa dentro de un panel de mi…

�Por qu� no usas el comando pascal exec? (
http://www.freepascal.org/docs-html/rtl/dos/exec.html) Con �l puedes lanzar cualquier aplicaci�n desde tu programa, el que permanecer� abierto hasta que cierres el �ltimo. Un saludo.

El 2 de agosto de 2013 16:10, Antonio Evora <aevorar en gmail.com> escribi�:

Show quoted text 91 lines
Buenas, Lo que necesito es empotrar una aplicaci�n externa dentro de un panel de mi aplicaci�n. Lo que se pretende es que desde mi aplicaci�n pueda lanzar distintas aplicaciones externas que se mostrar�n dentro de la m�a (a modo de panel de gesti�n). He conseguido realizarlo con �xito con el bloc de notas de Windows (la aplicaci�n solo debe correr en Windows, no es necesario que lo haga en otros sistemas) y con la calculadora. Esto lo consigo lanzando el proceso, espero un tiempo prudencial para dar tiempo a que muestre la ventana, la busco con findwindow y trabajo con ese handle (si quer�is os paso el c�digo de prueba). Lo que s� he notado que con aplicaciones m�s "complejas" (ventanas sin barra de t�tulo) el empotramiento falla, la semana que viene investigare un poco m�s y os contare avances. Cualquier informaci�n/aclaraci�n/orientaci�n ser� bienvenida. Un saludete y bien fin de semana. Enviado desde mi iPhone El 02/08/2013, a las 01:27, Martin Gomez <mmgomez en gmail.com> escribi�: Perd�n Antonio, pero para que necesitas saber el Handle? Le piensas enviar mensajes de Windows con SendMessage o algo por el estilo? Si es s�lo para esperar a que el proceso termine, puedes usar la propiedad Options, agregando poWaitOnExit, o mirando la propiedad Running. De acuerdo a la documentaci�n<http://www.freepascal.org/docs-html/fcl/process/tprocess.html>, las propiedades Handle y ProcessHandle te devuelven el Handle al programa, el Hwnd es el Handle a la ventana, no al programa, y no estoy seguro que eso funcione fuera de Windows. Saludos, Mart�n 2013/8/1 Jos� Mejuto <joshyfun en gmail.com> > El 01/08/2013 8:16, Antonio �vora escribi�: > > >>> No puedes :( Un proceso puede lanzar m�ltiples "windows", por lo tanto >>> lo �nico que puedes hacer es, usando el ThreadHandle, enumerar todas >>> las ventanas de ese proceso, y de alg�n modo elegir la que quieres. >>> >>> Gracias Jos�. >> Entiendo lo que me dices. Pero siempre debe haber un >> formulario/ventana/window principal, �como puedo saber cual es el >> principal? >> >> > Hola, > > No, no hay, ese es un concepto de Delphi. En mi opini�n lo m�ximo que > puedes acercarte de modo gen�rico es lanzar el proceso, y entrar en un > bucle esperando a que el proceso tenga alguna ventana abierta (EnumWindows) > y usar la primera que aparezca. Lo malo es que si el programa tiene una > ventana de presentaci�n (splash), esa es la que te comer�s :( > > Por supuesto esto no es cross-platform, en Windows funciona pero lo dudo > en otros SO. > > EnumWindows devuelve los handles de las ventanas por Z-Order, o sea, > primero la que se muestra por encima de las otras (dentro de ese proceso). > > -- > > > ______________________________**_________________ > Lazarus-es mailing list > Lazarus-es en lists.lazarus.**freepascal.org<Lazarus-es en lists.lazarus.freepascal.org> > http://lists.lazarus.**freepascal.org/mailman/**listinfo/lazarus-es<http://lists.lazarus.freepascal.org/mailman/listinfo/lazarus-es> > -- Try not to become a man of success but rather to become a man of value. *Albert Einstein* _______________________________________________ Lazarus-es mailing list Lazarus-es en lists.lazarus.freepascal.org http://lists.lazarus.freepascal.org/mailman/listinfo/lazarus-es _______________________________________________ Lazarus-es mailing list Lazarus-es en lists.lazarus.freepascal.org http://lists.lazarus.freepascal.org/mailman/listinfo/lazarus-es

------------ pr�xima parte ------------
Se ha borrado un adjunto en formato HTML...
URL: <http://lists.lazarus.freepascal.org/pipermail/lazarus-es/attachments/20130802/30b90dfc/attachment-0001.html>

Reply by email

Antonio Evora
to Rafael Bidegain: Hola Antonio El 2 de agosto de 2013 17:10, Antonio Evora <aevorar en gmail.com>…

Gracias Rafael,
El tema es que la propia aplicaci�n lanzada (sumatrapdf) tiene un par�metro (-plugin) de linea de comandos que permite que se pueda empotrar sin hacer nada mas, pero no es mi caso. Tendr�a que poder empotrar cualquier aplicaci�n.

Un cordial saludo.

El 02/08/2013, a las 22:45, Rafael Bidegain <r.bidegain en gmail.com> escribi�:

Show quoted text 27 lines
Hola Antonio El 2 de agosto de 2013 17:10, Antonio Evora <aevorar en gmail.com> escribi�: Buenas, Lo que necesito es empotrar una aplicaci�n externa dentro de un panel de mi aplicaci�n. Si es eso lo que necesitas te sugiero que veas esto: http://lists.lazarus.freepascal.org/pipermail/lazarus-es/2013-July/005428.html http://lists.lazarus.freepascal.org/pipermail/lazarus-es/2013-July/005439.html A Edgar le funcion� y mostr� como lo hizo. saludos -- Rafael Bidegain Ya que los cuerdos no hablan, hablar� el loco. (The Fool, Padraic Pearse) # yo quiero educaci�n libre. �YA! _______________________________________________ Lazarus-es mailing list Lazarus-es en lists.lazarus.freepascal.org http://lists.lazarus.freepascal.org/mailman/listinfo/lazarus-es

------------ pr�xima parte ------------
Se ha borrado un adjunto en formato HTML...
URL: <http://lists.lazarus.freepascal.org/pipermail/lazarus-es/attachments/20130804/14a2ef7c/attachment.html>

Reply by email

Antonio Evora
to Rubén Ibáñez: �Por qu� no usas el comando pascal exec? (…

Gracias Rub�n,
El problema no es al lanzar la aplicaci�n, si no de una vez lanzada en vez de mostrarse como ventana independiente apareciera en, por ejemplo, un tpanel dentro de un formulario.

Un cordial saludo.

El 03/08/2013, a las 05:54, Rub�n Ib��ez <ruben.mariano.ibanez en gmail.com> escribi�:

Show quoted text 75 lines
�Por qu� no usas el comando pascal exec? (http://www.freepascal.org/docs-html/rtl/dos/exec.html) Con �l puedes lanzar cualquier aplicaci�n desde tu programa, el que permanecer� abierto hasta que cierres el �ltimo. Un saludo. El 2 de agosto de 2013 16:10, Antonio Evora <aevorar en gmail.com> escribi�: Buenas, Lo que necesito es empotrar una aplicaci�n externa dentro de un panel de mi aplicaci�n. Lo que se pretende es que desde mi aplicaci�n pueda lanzar distintas aplicaciones externas que se mostrar�n dentro de la m�a (a modo de panel de gesti�n). He conseguido realizarlo con �xito con el bloc de notas de Windows (la aplicaci�n solo debe correr en Windows, no es necesario que lo haga en otros sistemas) y con la calculadora. Esto lo consigo lanzando el proceso, espero un tiempo prudencial para dar tiempo a que muestre la ventana, la busco con findwindow y trabajo con ese handle (si quer�is os paso el c�digo de prueba). Lo que s� he notado que con aplicaciones m�s "complejas" (ventanas sin barra de t�tulo) el empotramiento falla, la semana que viene investigare un poco m�s y os contare avances. Cualquier informaci�n/aclaraci�n/orientaci�n ser� bienvenida. Un saludete y bien fin de semana. Enviado desde mi iPhone El 02/08/2013, a las 01:27, Martin Gomez <mmgomez en gmail.com> escribi�: > Perd�n Antonio, pero para que necesitas saber el Handle? > Le piensas enviar mensajes de Windows con SendMessage o algo por el estilo? > Si es s�lo para esperar a que el proceso termine, puedes usar la propiedad Options, agregando poWaitOnExit, o mirando la propiedad Running. > > De acuerdo a la documentaci�n, las propiedades Handle y ProcessHandle te devuelven el Handle al programa, el Hwnd es el Handle a la ventana, no al programa, y no estoy seguro que eso funcione fuera de Windows. > > Saludos, > Mart�n > > > 2013/8/1 Jos� Mejuto <joshyfun en gmail.com> > El 01/08/2013 8:16, Antonio �vora escribi�: > > > No puedes :( Un proceso puede lanzar m�ltiples "windows", por lo tanto > lo �nico que puedes hacer es, usando el ThreadHandle, enumerar todas > las ventanas de ese proceso, y de alg�n modo elegir la que quieres. > > Gracias Jos�. > Entiendo lo que me dices. Pero siempre debe haber un > formulario/ventana/window principal, �como puedo saber cual es el > principal? > > > Hola, > > No, no hay, ese es un concepto de Delphi. En mi opini�n lo m�ximo que puedes acercarte de modo gen�rico es lanzar el proceso, y entrar en un bucle esperando a que el proceso tenga alguna ventana abierta (EnumWindows) y usar la primera que aparezca. Lo malo es que si el programa tiene una ventana de presentaci�n (splash), esa es la que te comer�s :( > > Por supuesto esto no es cross-platform, en Windows funciona pero lo dudo en otros SO. > > EnumWindows devuelve los handles de las ventanas por Z-Order, o sea, primero la que se muestra por encima de las otras (dentro de ese proceso). > > -- > > > _______________________________________________ > Lazarus-es mailing list > Lazarus-es en lists.lazarus.freepascal.org > http://lists.lazarus.freepascal.org/mailman/listinfo/lazarus-es > > > > -- > Try not to become a man of success but rather to become a man of value. Albert Einstein > _______________________________________________ > Lazarus-es mailing list > Lazarus-es en lists.lazarus.freepascal.org > http://lists.lazarus.freepascal.org/mailman/listinfo/lazarus-es _______________________________________________ Lazarus-es mailing list Lazarus-es en lists.lazarus.freepascal.org http://lists.lazarus.freepascal.org/mailman/listinfo/lazarus-es _______________________________________________ Lazarus-es mailing list Lazarus-es en lists.lazarus.freepascal.org http://lists.lazarus.freepascal.org/mailman/listinfo/lazarus-es

------------ pr�xima parte ------------
Se ha borrado un adjunto en formato HTML...
URL: <http://lists.lazarus.freepascal.org/pipermail/lazarus-es/attachments/20130804/a1431797/attachment-0001.html>

Reply by email

Antonio Évora
to Rubén Ibáñez: �Por qu� no usas el comando pascal exec? (…

Hola a todos,
Al final consegui una solucion mas o menos satisfactoria. Bueno, para muestra un bot�n, aqu� ten�is el c�digo de la clase por si a alguno le interesa:

//*******************************************COPIAR DESDE
AQUI********************************************************
unit cEmbutido;
{$mode objfpc}{$H+}
interface
uses
   Classes, Forms, SysUtils, Windows, process, Controls;
type
   TVentanaGuardianThread= class;
   TVentanaEmbutida = class (TObject)
   private
     FChangedParent: boolean;
     FClase: string;
     FClaseClick: string;
     FClicked: boolean;
     FHandle: THANDLE;
     FHandleClick: THANDLE;
     FTitulo: string;
     FTituloClick: string;
   public
     property Clase: string read FClase write FClase;
     property Titulo: string read FTitulo write FTitulo;
     property Handle: THANDLE read FHandle write FHandle;
     property ChangedParent: boolean read FChangedParent write
FChangedParent;
     property ClaseClick: string read FClaseClick write FClaseClick;
     property TituloClick: string read FTituloClick write FTituloClick;
     property HandleClick: THANDLE read FHandleClick write FHandleClick;
     property Clicked: boolean read FClicked write FClicked;
   end;
   TNuevaVentanaEvent = procedure(Sender: TObject; Ventana:
TVentanaEmbutida) of object;
   TTerminateStatus = (tsError, tsClose, tsTerminate);
   TEmbutido = class (TObject)
   private
     FExecName: string;
     FNewParent: TWinControl;
     FOnNuevaVentana: TNuevaVentanaEvent;
     FOnWindowCaptured: TNuevaVentanaEvent;
     FParamExec: TStringList;
     FVentanasEmbutidas: TList;
     FPID: integer;
     FProceso: TProcess;
     FVentanaGuardianThread: TVentanaGuardianThread;
     FOldResize: TNotifyEvent;
     procedure NuevaVentana(Sender: TObject; Ventana: TVentanaEmbutida);
     procedure ChangeParent(WindowsHandle: THandle);
     procedure SetNewParent(AValue: TWinControl);
     procedure Resize(Sender: TObject);
     property OnNuevaVentana: TNuevaVentanaEvent read FOnNuevaVentana
write FOnNuevaVentana;
     function Kill(ProcessID: DWORD; Timeout: Integer = MAXINT):
TTerminateStatus;
   public
     constructor Create();
     destructor Destroy();override;
     function Run(): boolean;
     function Stop(Clear: boolean): boolean;
     procedure AddVentana(Ventana: TVentanaEmbutida);overload;
     procedure AddVentana(Clase, Titulo: string);overload;
     procedure AddVentana(Clase, Titulo, ClaseClick, TituloClick:
string);overload;
     property ExecName: string read FExecName write FExecName;
     property ParamExec: TStringList read FParamExec;
     property PID: integer read FPID write FPID;
     property NewParent: TWinControl read FNewParent write SetNewParent;
     property VentanasEmbutidas: TList read FVentanasEmbutidas write
FVentanasEmbutidas;
     property OnWindowCaptured: TNuevaVentanaEvent read
FOnWindowCaptured write FOnWindowCaptured;
   end;
   TVentanaGuardianThread = class(TThread)
   public
     MustDie: boolean;
     Owner: TEmbutido;
   protected
     procedure CallEvent;
     procedure Execute; override;
   published
     property Terminated;
   end;
implementation
function EnumProcess(hHwnd: HWND; lParam: LPARAM): LongBool;stdcall;
var
   pPid : DWORD;
   title,
   ClassName : string;
   n: integer;
   CurrentVentana: TVentanaEmbutida;
   Propietario: TEmbutido;
begin
   Result:=false;
   if lParam=0 then
   begin
     exit;
   end;
   Propietario:=TEmbutido(lParam);
   //Si returna NULL entonces fallo
   Result:=not (hHwnd=NULL);
   if not Result then
   begin
     exit;
   end
   else
   begin
     if not IsWindowVisible(hHwnd) then
     begin
       exit;
     end;
     //Cojo el PID de la ventana
     GetWindowThreadProcessId(hHwnd,pPid);
     //Asigno memoria para recibir el classname del proceso
     SetLength(ClassName, 255);
     //Asigno el ClassName y ajusto la cadena
     SetLength(ClassName,
               GetClassName(hHwnd,
                            PChar(className),
                            Length(className)));
     //Asigno memoria para recibir el titulo del proceso
     SetLength(title, 255);
     //Asigno el titulo y ajusto la cadena
     SetLength(title, GetWindowText(hHwnd, PChar(title), Length(title)));
     //Convierto el titulo de ansi a utf8 por si tuviera acentos o
cualquier caracter no ASCII
     title:=AnsiToUtf8(title);
     //Compruebo el PID
     if (pPid=Propietario.PID) then
     begin
       for n:=0 to Propietario.VentanasEmbutidas.Count-1 do
       begin
         //if Propietario.ExecName='C:\Documents and
Settings\xx\Escritorio\MK_GPXTool_1.3.3\MK_GPXTool.exe' then
         //begin
         //  Propietario.ExecName:=Propietario.ExecName+'';
         //end;
CurrentVentana:=TVentanaEmbutida(Propietario.VentanasEmbutidas[n]);
         if ClassName=CurrentVentana.Clase then
         begin
           if CurrentVentana.Titulo='' then
           begin
             CurrentVentana.Handle:=hHwnd;
           end
           else
           begin
             if CurrentVentana.Titulo=title then
             begin
               CurrentVentana.Handle:=hHwnd;
             end;
           end;
         end;
       end;
     end
     else
     begin
       //No no es mi PID miro si hay alguna ventana embutida sin clase
definida
       for n:=0 to Propietario.VentanasEmbutidas.Count-1 do
       begin
CurrentVentana:=TVentanaEmbutida(Propietario.VentanasEmbutidas[n]);
         if CurrentVentana.Clase='' then
         begin
           if CurrentVentana.Titulo=title then
           begin
             //Encontre la ventana
             CurrentVentana.Handle:=hHwnd;
             //Sustituyo el PID por el nuevo PID
             Propietario.PID:=pPid;
           end;
         end;
       end;
     end;
   end;
end;
function EnumChildProc(hHwnd: HWND; lParam : LPARAM): LongBool; stdcall;
var
   pPid : DWORD;
   title,
   ClassName : string;
   n: integer;
   CurrentVentana: TVentanaEmbutida;
   Propietario: TEmbutido;
begin
   Result:=false;
   if lParam=0 then
   begin
     exit;
   end;
   Propietario:=TEmbutido(lParam);
   Result:=not (hHwnd=NULL);
   if not Result then
   begin
     exit;
   end
   else
   begin
     GetWindowThreadProcessId(hHwnd,pPid);
     SetLength(ClassName, 255);
     SetLength(ClassName,
               GetClassName(hHwnd,
                            PChar(className),
                            Length(className)));
     SetLength(title, 255);
     SetLength(title, GetWindowText(hHwnd, PChar(title), Length(title)));
     if (pPid=Propietario.PID) then
     begin
       for n:=0 to Propietario.VentanasEmbutidas.Count-1 do
       begin
CurrentVentana:=TVentanaEmbutida(Propietario.VentanasEmbutidas[n]);
         if (ClassName=CurrentVentana.ClaseClick) and
(title=CurrentVentana.TituloClick) then
         begin
           CurrentVentana.HandleClick:=hHwnd;
         end;
       end;
     end;
     Result := true;
   end;
end;
procedure TVentanaGuardianThread.CallEvent;
var
   aVentana: TVentanaEmbutida;
   n: integer;
begin
   if Assigned(Owner.FOnNuevaVentana) then
   begin
     for n:=0 to Owner.VentanasEmbutidas.Count-1 do
     begin
       aVentana:=TVentanaEmbutida(Owner.VentanasEmbutidas[n]);
       if (aVentana.Handle>0) and (not aVentana.ChangedParent) then
       begin
         Owner.FOnNuevaVentana(Owner,aVentana);
       end;
     end;
   end;
end;
procedure TVentanaGuardianThread.Execute;
begin
   try
     while not MustDie do
     begin
       EnumWindows(@EnumProcess,LPARAM(Owner));
       Synchronize(@CallEvent);
     end;
   finally
     Terminate;
   end;
end;
procedure TEmbutido.NuevaVentana(Sender: TObject; Ventana:
TVentanaEmbutida);
   function MouseClick(x: DWORD; y: DWORD): DWORD;
   var
     P: TPoint;
   begin
     GetCursorPos(P); // Guardo las coordenadas del mouse
     SetCursorPos(x, y);
     mouse_event(MOUSEEVENTF_LEFTDOWN, 0, 0, 0, 0);  // Press
     mouse_event(MOUSEEVENTF_LEFTUP, 0, 0, 0, 0);    // Release
     SetCursorPos(P.x, P.y); // Restauro las coordenadas del Mouse
   end;
var
   Rectangulo: TRect;
begin
   ChangeParent(Ventana.Handle);
   Ventana.ChangedParent:=true;
   FNewParent.SetFocus;
   if Ventana.ClaseClick'' then
   begin
     EnumChildWindows(Ventana.Handle, en EnumChildProc,LPARAM(self));
     if Ventana.HandleClick>0 then
     begin
       GetWindowRect(Ventana.HandleClick,Rectangulo);
       MouseClick(Rectangulo.Left+2,Rectangulo.Top+2);
     end;
   end;
   if Assigned(FOnWindowCaptured) then
   begin
     FOnWindowCaptured(self,Ventana);
   end;
end;
procedure TEmbutido.ChangeParent(WindowsHandle: THandle);
var
   WindowsStyle,
   FAppThreadID: LongInt;
begin
   WindowsStyle:=GetWindowLong(WindowsHandle,GWL_STYLE);
WindowsStyle:=WindowsStyle-WS_CAPTION-WS_BORDER-WS_OVERLAPPED-WS_THICKFRAME;
   SetWindowLong(WindowsHandle,GWL_STYLE,WindowsStyle);
   FAppThreadID:=GetWindowThreadProcessId(WindowsHandle,nil);
   AttachThreadInput(GetCurrentThreadId,FAppThreadID,true);
   windows.SetParent(WindowsHandle,NewParent.Handle);
   SendMessage(NewParent.Handle,WM_UPDATEUISTATE,UIS_INITIALIZE,0);
   UpdateWindow(WindowsHandle);
   SetWindowLong(NewParent.Handle,GWL_STYLE,
GetWindowLong(NewParent.Handle, GWL_STYLE) or WS_CLIPCHILDREN);
SetWindowPos(WindowsHandle,0,0,0,NewParent.Width,NewParent.Height,SWP_NOZORDER);
   SetForegroundWindow(WindowsHandle);
MoveWindow(WindowsHandle,0,0,NewParent.Width,NewParent.Height,true);
end;
procedure TEmbutido.SetNewParent(AValue: TWinControl);
begin
   if FNewParent=AValue then
   begin
     exit;
   end;
   if FNewParentnil then
   begin
     //Libero el onresize del parent antiguo
     FNewParent.OnResize:=FOldResize;
   end;
   FNewParent:=AValue;
   FOldResize:=FNewParent.OnResize;
   ;
end;
procedure TEmbutido.Resize(Sender: TObject);
var
   n: integer;
   CurrentVentana: TVentanaEmbutida;
begin
   for n:=0 to FVentanasEmbutidas.Count-1 do
   begin
     CurrentVentana:=TVentanaEmbutida(FVentanasEmbutidas[n]);
     if (CurrentVentana.Handle>0) and (CurrentVentana.ChangedParent) then
     begin
MoveWindow(CurrentVentana.Handle,0,0,FNewParent.Width,FNewParent.Height,true);
     end;
   end;
   if Assigned(FOldResize) then
   begin
     FOldResize(Sender);
   end;
end;
function EnumWindowsProc(hHwnd: HWND; lParam: LPARAM): LongBool;stdcall;
var
   PID: DWORD;
begin
   GetWindowThreadProcessId(hHwnd, @PID);
   if lParam=PID then
   begin
     PostMessage(hHwnd,WM_CLOSE,0,0);
   end;
   Result:=True;
end;
function TEmbutido.Kill(ProcessID: DWORD; Timeout: Integer
   ): TTerminateStatus;
var
   ProcessHandle: THandle;
begin
   Result:=tsError;
   if ProcessIDGetCurrentProcessId then
   begin
     ProcessHandle:=OpenProcess(SYNCHRONIZE or PROCESS_TERMINATE, False,
ProcessID);
     try
       if ProcessHandle0 then
       begin
         if Timeout>=0 then
         begin
           EnumWindows(@EnumWindowsProc,FPID);
           if WaitForSingleObject(ProcessHandle,Timeout)=WAIT_OBJECT_0 then
             Result:=tsClose
           else
             if TerminateProcess(ProcessHandle,0) then
               Result:=tsTerminate;
         end
         else
           if TerminateProcess(ProcessHandle,0) then
             Result:=tsTerminate;
       end;
     finally
       CloseHandle(ProcessHandle);
     end;
   end;
end;
constructor TEmbutido.Create;
begin
   FVentanasEmbutidas:=TList.Create;
   FParamExec:=TStringList.Create;
   FProceso:=TProcess.Create(nil);
   FVentanaGuardianThread:=TVentanaGuardianThread.Create(true);
   FVentanaGuardianThread.Owner:=self;
   FVentanaGuardianThread.MustDie:=false;
   ;
   FNewParent:=nil;
   FPID:=0;
end;
destructor TEmbutido.Destroy;
begin
   if FVentanaGuardianThreadnil then
   begin
     FVentanaGuardianThread.FreeOnTerminate:=false;
     FVentanaGuardianThread.MustDie:= true;
     if FPID>0 then
     begin
       while not FVentanaGuardianThread.Terminated do
       begin
         Application.ProcessMessages;
       end;
     end;
     FVentanaGuardianThread.Free;
     FVentanaGuardianThread:=nil;
   end;
   if FPID>0 then
   begin
     Kill(FPID,10);
   end;
   FVentanasEmbutidas.Clear;
   FVentanasEmbutidas.Free;
   FProceso.Free;
   FParamExec.Free;
   inherited Destroy;
end;
function TEmbutido.Run: boolean;
begin
   FProceso.Executable:=ExecName;
   FProceso.Parameters.Assign(FParamExec);
   FProceso.Execute;
   FPID:=FProceso.ProcessID;
   FVentanaGuardianThread.Start;
end;
function TEmbutido.Stop(Clear: boolean): boolean;
var
   n: integer;
   Ventana: TVentanaEmbutida;
begin
   Result:=(Kill(FPID,10)tsError);
   if Clear then
   begin
     for n:=0 to FVentanasEmbutidas.Count-1 do
     begin
       TVentanaEmbutida(FVentanasEmbutidas[n]).Free;
     end;
     FVentanasEmbutidas.Clear;
     FParamExec.Clear;
   end
   else
   begin
     for n:=0 to FVentanasEmbutidas.Count-1 do
     begin
       Ventana:=TVentanaEmbutida(FVentanasEmbutidas[n]);
       Ventana.Handle:=0;
       Ventana.ChangedParent:=false;
       Ventana.HandleClick:=0;
       Ventana.Clicked:=false;
     end;
   end;
end;
procedure TEmbutido.AddVentana(Ventana: TVentanaEmbutida);
begin
   Ventana.Handle:=0;
   Ventana.ChangedParent:=false;
   Ventana.HandleClick:=0;
   Ventana.Clicked:=false;
   FVentanasEmbutidas.Add(Ventana);
end;
procedure TEmbutido.AddVentana(Clase, Titulo: string);
begin
   AddVentana(Clase,Titulo,'','');
end;
procedure TEmbutido.AddVentana(Clase, Titulo, ClaseClick, TituloClick:
string);
var
   TempVentana: TVentanaEmbutida;
begin
   TempVentana:=TVentanaEmbutida.Create;
   TempVentana.Clase:=Clase;
   TempVentana.Titulo:=Titulo;
   TempVentana.Handle:=0;
   TempVentana.ChangedParent:=false;
   TempVentana.ClaseClick:=ClaseClick;
   TempVentana.TituloClick:=TituloClick;
   TempVentana.HandleClick:=0;
   TempVentana.Clicked:=false;
   AddVentana(TempVentana);
end;
end.
//*******************************************HASTA
AQUI********************************************************

Para abrir google earth y embutir su ventana seria algo como:

Embutido.ExecName:='C:\Archivos de programa\Google\Google
Earth\client\googleearth.exe';
Embutido.AddVentana('QWidget','Google Earth');
;
Embutido.Run();

Espero os sirva.
Saludos.

Reply by email