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 31-03-2009
Avatar de rgstuamigo
rgstuamigo rgstuamigo is offline
Miembro
 
Registrado: jul 2008
Ubicación: Santa Cruz de la Sierra-Bolivia
Posts: 1.646
Poder: 17
rgstuamigo Va por buen camino
Thumbs up 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.
__________________
"Pedid, y se os dará; buscad, y hallaréis; llamad, y se os abrirá." Mt.7:7
Responder Con Cita
  #2  
Antiguo 31-03-2009
Avatar de Neftali [Germán.Estévez]
Neftali [Germán.Estévez] Neftali [Germán.Estévez] is online now
[becario]
 
Registrado: jul 2004
Ubicación: Barcelona - España
Posts: 18.275
Poder: 10
Neftali [Germán.Estévez] Es un diamante en brutoNeftali [Germán.Estévez] Es un diamante en brutoNeftali [Germán.Estévez] Es un diamante en bruto
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.
__________________
Germán Estévez => Web/Blog
Guía de estilo, Guía alternativa
Utiliza TAG's en tus mensajes.
Contactar con el Clubdelphi

P.D: Más tiempo dedicado a la pregunta=Mejores respuestas.
Responder Con Cita
  #3  
Antiguo 31-03-2009
Avatar de rgstuamigo
rgstuamigo rgstuamigo is offline
Miembro
 
Registrado: jul 2008
Ubicación: Santa Cruz de la Sierra-Bolivia
Posts: 1.646
Poder: 17
rgstuamigo Va por buen camino
Red face

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.
__________________
"Pedid, y se os dará; buscad, y hallaréis; llamad, y se os abrirá." Mt.7:7
Responder Con Cita
  #4  
Antiguo 31-03-2009
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
Código Delphi [-]
h2:=FindWindow('SciCalc',nil);

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

// Saludos
Responder Con Cita
  #5  
Antiguo 01-04-2009
Avatar de cHackAll
[cHackAll] cHackAll is offline
Baneado?
 
Registrado: oct 2006
Posts: 2.159
Poder: 20
cHackAll Va por buen camino
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;
__________________
RTFM > STFW > Foro > Truco > Post > cHackAll > KeBugCheckEx
Responder Con Cita
  #6  
Antiguo 01-04-2009
Avatar de Neftali [Germán.Estévez]
Neftali [Germán.Estévez] Neftali [Germán.Estévez] is online now
[becario]
 
Registrado: jul 2004
Ubicación: Barcelona - España
Posts: 18.275
Poder: 10
Neftali [Germán.Estévez] Es un diamante en brutoNeftali [Germán.Estévez] Es un diamante en brutoNeftali [Germán.Estévez] Es un diamante en bruto
Cita:
Empezado por roman Ver Mensaje
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?

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.
Archivos Adjuntos
Tipo de Archivo: zip Form Class Spy.zip (15,6 KB, 17 visitas)
__________________
Germán Estévez => Web/Blog
Guía de estilo, Guía alternativa
Utiliza TAG's en tus mensajes.
Contactar con el Clubdelphi

P.D: Más tiempo dedicado a la pregunta=Mejores respuestas.
Responder Con Cita
  #7  
Antiguo 01-04-2009
Avatar de rgstuamigo
rgstuamigo rgstuamigo is offline
Miembro
 
Registrado: jul 2008
Ubicación: Santa Cruz de la Sierra-Bolivia
Posts: 1.646
Poder: 17
rgstuamigo Va por buen camino
Lightbulb

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."
Saludos...
__________________
"Pedid, y se os dará; buscad, y hallaréis; llamad, y se os abrirá." Mt.7:7

Última edición por rgstuamigo fecha: 01-04-2009 a las 21:33:06.
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 fichero externo jocey Varios 3 05-08-2008 22:05:53
Configurar aplicacion con archivo externo voldemmor Varios 1 10-01-2008 21:28:38
Form fsStayOnTop de otro Form fsStayOnTop Colgueit OOP 0 24-06-2006 16:57:38
se podra abrir delphi al estilo VB Michel Varios 3 07-07-2003 18:57:09


La franja horaria es GMT +2. Ahora son las 12:01:04.


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