Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Varios (https://www.clubdelphi.com/foros/forumdisplay.php?f=11)
-   -   Abrir un exe externo a mi aplicacion pero con estilo fsStayOnTop (https://www.clubdelphi.com/foros/showthread.php?t=64402)

rgstuamigo 31-03-2009 00:51:29

Abrir un exe externo a mi aplicacion pero con estilo fsStayOnTop
 
Holas amigos del club,estoy abriendo un exe externo a mi aplicasion con la siguiente funcion:
Código Delphi [-]
WinExec('Ruta\MiExe.exe',0);
Funciona bien ,pero quisiera que tuviera el estilo que tiene el administrador de tareas de Windows es decir que cuando otra aplicacion se habre encima, esta no cubre el formulario,sino que visualmente se pone atras.
Para hacer esto en Delphi se pone la propiedad:
Código Delphi [-]
FormStyle:=fsStayOnTop;
del formulario;es exactamente lo que quiero que suceda con el .exe que habro con la funcion WinExec, que tomara ese estilo;;)
Gracias de antemano por sus colaboraciones y ayuda.:)

Neftali [Germán.Estévez] 31-03-2009 12:47:50

POdrías utilizar FindWindow para encontrar la ventana principal de tu EXE (preferíblemente usando ClassName) y luego llamar a SetWindowPos para cambiar la forma en que se visualiza la ventana.

Código Delphi [-]
var
  h2:HWND;
begin

  // En este caso se hace para el notepad 
  // Usando el parámetro CLASSNAME 
  h2 := FindWindow('Notepad', nil);
  // Encontrada?
  if (h2<>0) then begin
    // TOP MOST
    SetWindowPos(h2,
               HWND_TOPMOST,
               Left,
               Top,
               Width,
               Height,
               SWP_NOACTIVATE or SWP_NOMOVE or SWP_NOSIZE);
  end;

Si sabes la clase de tu form principal, puedes sustituir el "notepad" por la clase de tu form. También puedes usar el segundo parámetro para el título, pero personalmente me gusta más usar el primero.

rgstuamigo 31-03-2009 21:20:23

Gracias por responder amigo Neftali,:),pero al parecer no me funciona el codigo que posteaste.:(. Talves este haciendo algo mal.
Queria preguntarte algunas dudas;La funcion FindWindow no la conocia pero segun veo obtiene el Handle de lo que se le pasa en el parametro,me imagino que para que funcione el exe en cuestion ya debe estar abierto ¿verdad?,si me estoy equivocando avisame;eso significa que el siguiente codigo deberia funcionarme y no es asi:
Aqui les pongo un codigo ejemplo que no hace lo yo quiero,por poner un ejemplo estoy abriendo la calculadora de Window, lo malo es que no se pone con el estilo que quisiera:
Código Delphi [-]
procedure TForm1.Button1Click(Sender: TObject);
var
  h2:HWND;
begin
WinExec('calc.exe',SW_SHOWNORMAL);//aqui habro la calculadora
// siguiendo el consejo de Neftali
h2:=FindWindow('calc',nil);
if h2<>0 then
    SetWindowPos(h2,
               HWND_TOPMOST,
               Left,
               Top,
               Width,
               Height,
               SWP_NOACTIVATE or SWP_NOMOVE or SWP_NOSIZE);

end;
Pero como les digo no me pone el estilo fsStayOnTop a la ventana.:(

roman 31-03-2009 23:03:35

Código Delphi [-]
h2:=FindWindow('SciCalc',nil);

El nombre de la clase de la ventana de la calculadora es SciCalc, no calc.

// Saludos

cHackAll 01-04-2009 02:14:52

Aunque funciona, "buscar" una ventana no significa encontrar la que tu has creado;

Código Delphi [-]
function EnumThreadWndProc(hWnd, lParam: Cardinal): LongBool; stdcall;
begin
 Result := not SetWindowPos(hWnd, HWND_TOPMOST, 0, 0, 0, 0, SWP_NOMOVE or SWP_NOSIZE);
end;
 
var si: TStartupInfo = (cb: SizeOf(si));
 
procedure TForm1.Button1Click(Sender: TObject);
var pi: TProcessInformation;
begin
 CreateProcess(nil, 'calc', nil, nil, False, 0, nil, nil, si, pi);
 WaitForInputIdle(pi.hProcess, INFINITE);
 EnumThreadWindows(pi.dwThreadId, @EnumThreadWndProc, 0);
end;

Neftali [Germán.Estévez] 01-04-2009 09:38:31

1 Archivos Adjunto(s)
Cita:

Empezado por roman (Mensaje 343389)
El nombre de la clase de la ventana de la calculadora es SciCalc, no calc.

Ampliando lo que dice Román, como ves la función FindWindow admite dos parámetros; El ClassName y el Título. Son los dos que puedes utilizar para encontrar una ventana.
En al caso de la calculadora, podrías utilizar:

Código Delphi [-]
// POr ClassName
h2:=FindWindow('SciCalc',nil);
// Por título
h2:=FindWindow(nil, 'Calculadora');

La siguiente pregunta lógica debe ser: ¿Y cómo se la clase de una ventana? :D

Hay muchas utilidades que te pueden dar esta información tipo WinSpy, WinExp o FormClassSpy (esta última como es la más pequeña y simple te la adjunto) y seguro que por internet encuentras muchas más....



TAmbién debes tener en cuenta las llimitaciones de FindWindow, tal como apunta cHackAll.
Si utilizas el título, debes tener en cuenta que el título no es siempre el mismo (a veces cambian durante la ejecución o en distintos idiomas) y en cuanto a la clase, pues tampoco es infalible si tienes 2 o 3 calculadoras ejecutándose.

rgstuamigo 01-04-2009 21:22:02

Muchas gracias a los tres,;),vaya ya decia yo que talves podria ir por el nombre, y muy buena esa herramienta Neftali;).
Mi codigo quedo asi:
Código Delphi [-]
procedure TForm1.Button1Click(Sender: TObject);
var
  h2:HWND;
begin
WinExec('calc.exe',SW_SHOWNORMAL);//aqui habro la calculadora
// siguiendo el consejo de Neftali
h2:=FindWindow('SciCalc',nil);
if h2<>0 then
    SetWindowPos(h2,
               HWND_TOPMOST,
               Left,
               Top,
               Width,
               Height,
               SWP_NOACTIVATE or SWP_NOMOVE or SWP_NOSIZE);

end;
Empesado por Neftali>
Cita:

...pues tampoco es infalible si tienes 2 o 3 calculadoras ejecutándose.
Pues para evitar dos o mas ventanas abiertas se me ocurre esto:
Código Delphi [-]
procedure TForm1.Button1Click(Sender: TObject);
var
  h2,h1:HWND;
begin
h1:=FindWindow('SciCalc',nil);//busco si hay una calculadora abierta;
if h1=0 then//si no hay ninguna calculadora abierta procedo normalmente
 begin
  WinExec('calc.exe',SW_SHOWNORMAL);//aqui habro la calculadora
  // siguiendo el consejo de Neftali
  h2:=FindWindow('SciCalc',nil);
  if h2<>0 then
    SetWindowPos(h2,
               HWND_TOPMOST,
               Left,
               Top,
               Width,
               Height,
               SWP_NOACTIVATE or SWP_NOMOVE or SWP_NOSIZE);
  end
 else ShowMessage('Ya tiene una calculadora abierta..Usela no sea flojo'+#13 //si ya existe una calculadora abierta
          +'Y trabaje duro para ganarse el pan de cada dia.');

end;
Desde luego que quisas sea trucha mi solucion pero funciona y me evita que el usuario desde la aplicacion me habra dos o mas calculadoras.;).
Como dicen los españoles: "si teneis otra solucion posteala.":D
Saludos...


La franja horaria es GMT +2. Ahora son las 00:23:02.

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