Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

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

Grupo de Teaming del ClubDelphi

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 10-06-2015
albelg albelg is offline
Miembro
NULL
 
Registrado: may 2015
Posts: 21
Poder: 0
albelg Va por buen camino
Abrir un Programa Externo dentro de una Ventana de una Aplicación

Hola a todos los colegas el club. necesito hacer un programita que de desde delphi me abra una aplicacion.exe y que esta ultima abra dentro de la ventana de mi programita.
lo que tengo es lo siguiente. gracias de antemano

Código Delphi [-]
procedure tform1.buttonclick(sender:tobject); 
var
 operacion,nombre,parametro,path:string;
begin     
  operacion:='open'; 
  nombre:='MMLCM.exe';
  parametro:='C:\WINDOWS\WIN.INI'; 
  path:='C:\Program Files\DIAX-OM\PROGRAM';
  shellexecute(handle,pchar(operacion),pchar(nombre),pchar(parametro),pchar(path),sw_shownormal);   
end;

Última edición por ecfisa fecha: 10-06-2015 a las 15:36:55. Razón: Etiquetas Delphi/Identación
Responder Con Cita
  #2  
Antiguo 10-06-2015
Avatar de duilioisola
[duilioisola] duilioisola is offline
Miembro Premium
 
Registrado: ago 2007
Ubicación: Barcelona, España
Posts: 1.734
Poder: 20
duilioisola Es un diamante en brutoduilioisola Es un diamante en brutoduilioisola Es un diamante en bruto
Quizás esto te sirva: http://www.clubdelphi.com/foros/showthread.php?t=50300
Responder Con Cita
  #3  
Antiguo 10-06-2015
Avatar de duilioisola
[duilioisola] duilioisola is offline
Miembro Premium
 
Registrado: ago 2007
Ubicación: Barcelona, España
Posts: 1.734
Poder: 20
duilioisola Es un diamante en brutoduilioisola Es un diamante en brutoduilioisola Es un diamante en bruto
Aquí hay otra opción http://stackoverflow.com/questions/7...-a-delphi-form

Código Delphi [-]
procedure TForm1.Button1Click(Sender: TObject);
var
  Rec: TShellExecuteInfo;
const
  AVerb = 'open';
  AParams = '';
  AFileName = 'Notepad.exe';
  ADir = '';
begin
  FillChar(Rec, SizeOf(Rec), #0);

  Rec.cbSize       := SizeOf(Rec);
  Rec.fMask        := SEE_MASK_NOCLOSEPROCESS;
  Rec.lpVerb       := PChar( AVerb );
  Rec.lpFile       := PChar( AfileName );
  Rec.lpParameters := PChar( AParams );
  Rec.lpDirectory  := PChar( Adir );
  Rec.nShow        := SW_HIDE;

  ShellExecuteEx(@Rec);
  WaitForInputIdle(Rec.hProcess, 5000);

  fNotepadHandle := Windows.FindWindow( 'Notepad', nil );
  Windows.SetParent( fNotepadHandle, Handle );

  Resize;
  ShowWindow(fNotepadHandle, SW_SHOW);
end;

procedure TForm1.FormResize(Sender: TObject);
begin
  if IsWindow(fNotepadHandle) then begin
    SetWindowPos(fNotepadHandle, 0, 0, 0, ClientWidth, ClientHeight,
      SWP_ASYNCWINDOWPOS);
  end;
end;
Responder Con Cita
  #4  
Antiguo 10-06-2015
albelg albelg is offline
Miembro
NULL
 
Registrado: may 2015
Posts: 21
Poder: 0
albelg Va por buen camino
gracias hermano por responder pero me da error en la linea:
Código Delphi [-]
  fNotepadHandle := Windows.findwindow('notepad',nil);
?que tipo de variable es fnotepadhandle?

Última edición por nlsgarcia fecha: 10-06-2015 a las 17:46:42. Razón: Formateo y Sintaxis Delphi
Responder Con Cita
  #5  
Antiguo 10-06-2015
Avatar de Casimiro Notevi
Casimiro Notevi Casimiro Notevi is offline
Moderador
 
Registrado: sep 2004
Ubicación: En algún lugar.
Posts: 32.039
Poder: 10
Casimiro Notevi Tiene un aura espectacularCasimiro Notevi Tiene un aura espectacular
Recuerda poner los tags al código fuente, ejemplo:



Gracias
Responder Con Cita
  #6  
Antiguo 10-06-2015
aposi aposi is offline
Miembro
 
Registrado: dic 2006
Posts: 146
Poder: 18
aposi Va por buen camino
Cita:
Empezado por albelg Ver Mensaje
gracias hermano por responder pero me da error en la linea:

fNotepadHandle:=Windows.findwindow('notepad',nil);

?que tipo de variable es fnotepadhandle?
Código Delphi [-]
  fNotepadHandle : HWND;

Última edición por nlsgarcia fecha: 10-06-2015 a las 17:47:29. Razón: Sintaxis Delphi
Responder Con Cita
  #7  
Antiguo 10-06-2015
albelg albelg is offline
Miembro
NULL
 
Registrado: may 2015
Posts: 21
Poder: 0
albelg Va por buen camino
Cool

ya me corrio el programa, pero lo que necesito es que el .exe me abra dentro de mi formulario y no de manera independiente. gracias de antemano
Responder Con Cita
  #8  
Antiguo 10-06-2015
Avatar de duilioisola
[duilioisola] duilioisola is offline
Miembro Premium
 
Registrado: ago 2007
Ubicación: Barcelona, España
Posts: 1.734
Poder: 20
duilioisola Es un diamante en brutoduilioisola Es un diamante en brutoduilioisola Es un diamante en bruto
A mi si que me funciona correctamete:
Temas a tener en cuenta:
fNotepadHandle es del tipo HWND y debe ser global al formulario en el que se trabaja.
En mi caso
Código Delphi [-]
type
  TFMPruebas = class(TG2KForm)
    ...
  private
     { Private declarations }
     fNotepadHandle : HWND;
  public
     { Public declarations }
  end;

Yo he creado un botón y un panel en donde tiene que estar el Notepad.

El botón tiene el código que enivé y rellena la variable fNotepadHandle.
El panel tiene e código de OnResize que utiliza la variable global fNotepadHandle.
Imágenes Adjuntas
Tipo de Archivo: png NotepadDentroAplicacion.png (43,4 KB, 29 visitas)
Responder Con Cita
  #9  
Antiguo 10-06-2015
albelg albelg is offline
Miembro
NULL
 
Registrado: may 2015
Posts: 21
Poder: 0
albelg Va por buen camino
Question

disculpa si mi pregunta es de novato pero como tu creas el panel para montar el notepad. gracias y por favor no pierda la paciencia conmigo
Responder Con Cita
  #10  
Antiguo 10-06-2015
Avatar de ecfisa
ecfisa ecfisa is offline
Moderador
 
Registrado: dic 2005
Ubicación: Tres Arroyos, Argentina
Posts: 10.508
Poder: 36
ecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to behold
Hola abelg.
Cita:
Empezado por albelg Ver Mensaje
disculpa si mi pregunta es de novato pero como tu creas el panel para montar el notepad. gracias y por favor no pierda la paciencia conmigo
Solo agrega uno en el formulario en tiempo de diseño, del mismo modo que lo haces con un botón o un edit, etc.

Saludos
__________________
Daniel Didriksen

Guía de estilo - Uso de las etiquetas - La otra guía de estilo ....
Responder Con Cita
  #11  
Antiguo 11-06-2015
Avatar de duilioisola
[duilioisola] duilioisola is offline
Miembro Premium
 
Registrado: ago 2007
Ubicación: Barcelona, España
Posts: 1.734
Poder: 20
duilioisola Es un diamante en brutoduilioisola Es un diamante en brutoduilioisola Es un diamante en bruto
Si quieres crear el Panel de forma dinámica puedes hacerlo así:

Código Delphi [-]
type
  TFMPruebas = class(TForm)
...
     procedure PNLEjecutarNotepadResize(Sender: TObject);
  private
     { Private declarations }
     fNotepadHandle : HWND;
...
  public
     { Public declarations }
...
  end;

procedure TFMPruebas.BEjecutarNotepadClick(Sender: TObject);
var
  Rec: TShellExecuteInfo;
  Panel : TPanel;
const
  AVerb = 'open';
  AParams = '';
  AFileName = 'Notepad.exe';
  ADir = '';
begin
  // Crear panel en forma dinamica
  Panel := TPanel.Create(Self);
  with Panel do
  begin
     // Debe estar sobre el Tabsheet
     Parent := TabSheet1;
     // Alineado al total del espacio disponible
     Align := alClient;
     // Cuando cambie de tamaño debe ejecutar esto para ajustar el tamaño del programa ejecutado dentro
     OnResize := PNLEjecutarNotepadResize;
  end;

  FillChar(Rec, SizeOf(Rec), #0);

  Rec.cbSize       := SizeOf(Rec);
  Rec.fMask        := SEE_MASK_NOCLOSEPROCESS;
  Rec.lpVerb       := PChar( AVerb );
  Rec.lpFile       := PChar( AfileName );
  Rec.lpParameters := PChar( AParams );
  Rec.lpDirectory  := PChar( Adir );
  Rec.nShow        := SW_HIDE;

  ShellExecuteEx(@Rec);
  WaitForInputIdle(Rec.hProcess, 5000);

  fNotepadHandle := Windows.FindWindow( 'Notepad', nil );
  Windows.SetParent( fNotepadHandle, Panel.Handle );

  // Put the focus on notepad
  Windows.SetFocus( fNotepadHandle );

  Resize;
  ShowWindow(fNotepadHandle, SW_SHOW);
end;

procedure TFMPruebas.PNLEjecutarNotepadResize(Sender: TObject);
begin
  if IsWindow(fNotepadHandle) then begin
    SetWindowPos(fNotepadHandle, 0, 0, 0, TPanel(Sender).ClientWidth, TPanel(Sender).ClientHeight,
      SWP_ASYNCWINDOWPOS);
  end;
end;
Responder Con Cita
  #12  
Antiguo 11-06-2015
albelg albelg is offline
Miembro
NULL
 
Registrado: may 2015
Posts: 21
Poder: 0
albelg Va por buen camino
muchas gracias hermano, me sirvio de mucho y te lo agradezco nuevamente y puedes estar seguro que en mi proyecto daré tus creditos
Responder Con Cita
  #13  
Antiguo 12-06-2015
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
Me permito decir que la API FindWindow tiene las desventaja de tener que conocer el nombre de la clase de ventana o el Caption (este último puede ser cambiante). Lo ideal es poder conocer el Handle de la ventana de un proceso desde su pid.

En ese sentido propongo complicar el código:
Código Delphi [-]
function GetWindowFromPId(PId: DWORD): THandle;
type
  TWinParam = record
    Handle: THandle;
    PId: DWORD;
  end;
  PWinParam = ^TWinParam;
var
  WinParam: TWinParam;

  function EnumWindowsProc(Handle: Thandle; lParam: LPARAM): BOOL; stdcall;
  var
    PId: DWORD;
  begin
    Result:= true;
    PId:= 0;
    GetWindowThreadProcessId(Handle, PId);
    if PWinParam(lParam).PId = PId then
    begin
      PWinParam(lParam).Handle:= Handle;
      Result:= false;
    end;
  end;

begin
  WinParam.Handle:= 0;
  WinParam.PId:= PId;
  EnumWindows(@EnumWindowsProc, LPARAM(@WinParam));
  repeat
    Result:= WinParam.Handle;
    WinParam.Handle:= Windows.GetParent(Result);
  until WinParam.Handle = 0;
end;

// Handle es el de la ventana donde queremos incluir el ejecutable.
function ExecuteAsChild(CommandLine: String; Handle: THandle): THandle;
var
  SI: TStartupInfo;
  PI: TProcessInformation;
  CR: TRect;
begin
  ZeroMemory(@SI, sizeof(TStartupInfo));
  SI.cb:= sizeof(SI);
  Result:= 0;
  if CreateProcess(nil, PCHAR(CommandLine), nil, nil, false, 0, nil, nil, SI, PI) then
  begin
    WaitForInputIdle(PI.hProcess, 10000);
    Result:= GetWindowFromPId(PI.dwProcessId);
    Windows.SetParent(Result, Handle);
    GetClientRect(Handle, CR);
    SetWindowPos(Result, 0, 0, 0, CR.Right-CR.Left, CR.Bottom-CR.Top, SWP_SHOWWINDOW);
    CloseHandle(PI.hProcess);
    CloseHandle(PI.hThread);
  end;
end;

Si quisiéramos usar la versión propuesta por duilioisola con ShellExecuteEx en lugar de con CreateProcess, también podemos:

Código Delphi [-]
type
function GetProcessId(hProcess: THANDLE): DWORD; stdcall;  external  Kernel32;

function ExecuteAsChild2(ExeFile: String; Handle: THandle): THandle;
var
  RI: TShellExecuteInfo;
  CR: TRect;
begin
  FillChar(RI, SizeOf(RI), #0);

  RI.cbSize       := SizeOf(RI);
  RI.fMask        := SEE_MASK_NOCLOSEPROCESS;
  RI.lpVerb       := 'Open';
  RI.lpFile       := PChar(ExeFile);
  RI.lpParameters := PChar('');
  RI.lpDirectory  := PChar('');

  Result:= 0;
  if ShellExecuteEx(@RI) then
  begin
    WaitForInputIdle(Ri.hProcess, 5000);
    Result:= GetWindowFromPId(GetProcessId(Ri.hProcess));
    Windows.SetParent(Result, Handle );
    Windows.GetClientRect(Handle, CR);
    SetWindowPos(Result, 0, 0, 0, CR.Right-CR.Left, CR.Bottom-CR.Top, SWP_SHOWWINDOW);
    CloseHandle(RI.hProcess);
  end;
end;


Saludos.

Última edición por escafandra fecha: 12-06-2015 a las 13:48:32.
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
Abrir un exe externo a mi aplicacion pero con estilo fsStayOnTop rgstuamigo Varios 6 01-04-2009 21:22:02
Abrir un fichero externo jocey Varios 3 05-08-2008 22:05:53
Abrir una aplicacion extena dentro de la mia grone35 Varios 2 17-08-2006 18:02:42
programa externo hugoacosta API de Windows 2 17-04-2006 19:44:57
Ejecutar un programa externo desde un programa de Delphi Roger_Fernandez Varios 3 02-09-2004 18:05:36


La franja horaria es GMT +2. Ahora son las 14:10:59.


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