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 18-10-2003
cso2000 cso2000 is offline
Miembro
 
Registrado: may 2003
Ubicación: Guadalajara, Jalisco
Posts: 108
Poder: 22
cso2000 Va por buen camino
Como traigo al frente una aplicacion que no sea la mia

Saludos:


mi problema es que ocupo hacer una aplicacion que me muestre las aplicaciones abiertas,

es decir tengo abierto excell y word y quiero que mi aplicacion ponga al frente 3 sec una aplicacion y 3 Sec la otra


con una funcion puedo obtener la lista de los exes que se estan ejecutando incluso obtengo los Thred de cada exe


utilizo el siguiente codigo y no me funciona

Por fa. alguien Ayudeme


Código:
    FgThreadId  := GetWindowThreadProcessId(GetForegroundWindow, nil);
    ActIdApp;
    AppThreadId := arreglo_Th[ id_app ];

//    AppThreadId := GetWindowThreadProcessId(Handle, nil);

    Self.Caption := Inttostr( AppThreadId ) + ' ' + Inttostr( FgThreadId );
    

    { Anexar el hilo de nuestra app. al de la  que tenga el foco }
    AttachThreadInput( AppThreadId , FgThreadId , true);

    { Ahora sí, activar la applicación }
    SetForegroundWindow(Handle);

    { Separar el hilo de nuestra app de la otra }
    AttachThreadInput( AppThreadId , FgThreadId , false);

la funcion ActIdApp; obtiene cada uno de los THred que tengo en un Arreglo.


Gracias a Yodos
Responder Con Cita
  #2  
Antiguo 18-10-2003
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
Este código, que por cierto tomaste de http://www.clubdelphi.com/users/roman/uiapp.php,
está pensado para traer al frente la aplicación desde donde se llama este código de manera que desconozco si sirve para el caso que intentas aplicar. Lo que observo es que, a pesar de que cambiaste AppThreadId para que apunte al hilo de la aplicación que deseas activar, no parece que hayas cambiado el Handle en la llamada a SetForegroundWindow, así que posiblemente también debas cambiarlo para que apunte a la ventana de la aplicación que intentas activar.

// Saludos
Responder Con Cita
  #3  
Antiguo 18-10-2003
cso2000 cso2000 is offline
Miembro
 
Registrado: may 2003
Ubicación: Guadalajara, Jalisco
Posts: 108
Poder: 22
cso2000 Va por buen camino
Gracias Roman:

y de hecho si tome el codigo de ahi:

y respecto a tu respuesta te refieres


SetForegroundWindow(AppThreadId);

Si es asi ya lo probe. y no me funciono no se si puedas ayudarme con otra pista.


Gracias.
Responder Con Cita
  #4  
Antiguo 18-10-2003
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:
Posteado originalmente por cso2000
SetForegroundWindow(AppThreadId);
Pero el parámetro de SetForegroundWindow debe ser el "Handle" de la ventana y no el del hilo. Ventanas e hilos no son lo mismo. Un hilo puede manejar varias ventanas y una aplicación puede manejar varios hilos.

¿Cómo estás obteniendo la lista de hilos? Quizá algo similar te permita obener la lista de ventanas.

// Saludos
Responder Con Cita
  #5  
Antiguo 18-10-2003
cso2000 cso2000 is offline
Miembro
 
Registrado: may 2003
Ubicación: Guadalajara, Jalisco
Posts: 108
Poder: 22
cso2000 Va por buen camino
Muchisimas gracias Roman


Eso de cambiar el hanle me resulto muy bien

estoy afinando la aplicacion por que traigo varios errores
pero creo que con esto me funciona bien



gracias de nuevo
Responder Con Cita
  #6  
Antiguo 22-10-2003
cso2000 cso2000 is offline
Miembro
 
Registrado: may 2003
Ubicación: Guadalajara, Jalisco
Posts: 108
Poder: 22
cso2000 Va por buen camino
Hola Amigos del Foro:


Recurri a este hilo ( no se si es correcto ) porque tengo un pequeño problema Respecto a la solucion de mi problema:


Siguiendo la recomendacion de roman cambie el valor que utilizo para traer la ventana al frente oteniendo por separado el hanle de esta y funciona correctamente el problema es que para algunos programas no funciona Ejemp. el Internet Explorer o el explorador de Windows, o Excel, word...

Haber si me pueden echar la mano el codigo que utilizo para obtener el hilo y el hanle es el sig.

Código:
procedure TForm1.Button1Click(Sender: TObject);
 
    function SacaExe(MangoW:HWND):string;
    {Obtiene el EXE de una tarea}
    {get EXE of a task}
    var 
      Datos    :TProcessEntry32;
      hID       : DWord;
      Snap    : Integer;
    begin 
      GetWindowThreadProcessId(MangoW,@hID);
      Snap:=CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS,0);
      try
        Datos.dwSize:=SizeOf(Datos);
        if(Process32First(Snap,Datos))then
        begin 
          repeat 
            if Datos.th32ProcessID=hID then 
            begin 
              Result:=StrPas(Datos.szExeFile);
              Break;
            end; 
          until not(Process32Next(Snap,Datos));
        end; 
      finally
        Windows.CloseHandle(Snap);
      end; 
    end; 
 
 
   function ObtieneVentanas(Mango: HWND;
            Nada: Pointer): Boolean; stdcall;
   var 
      sTemp:string;
   begin 
     Result := True;
     {Mango es el handle de la tarea encontrada}
     {Añadimos el .EXE si no está ya añadido...}
     sTemp:=SacaExe(Mango);
      with Form1.ListBox1.Items do
        if IndexOf(sTemp) = - 1 then begin
            Add(sTemp);
            Form1.lstTh.add( inttostr( GetWindowThreadProcessId(Mango,NIL) ) ); 
            Arreglo_HWND[ Form1.lstTh.count - 1 ] := Mango; 
        end;
   end; 
 
begin 
  EnumWindows( @ObtieneVentanas, 0 );
end;

Espero que alguien me pueda dar una pista, de antemano Garcias a Todos.
Responder Con Cita
  #7  
Antiguo 22-10-2003
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
Comentario al margen:

En Windows 2000 siempre que tengo una ventana de IE abierta, las siguientes que desee abrir jamás se activan correctamente. A veces aparecen pero no tienen el foco y aveces sólo queda parpadeando el botón en la barra de tareas; situaciones por demás exasperantes.

Si el mismo IE no es capaz de activarse a sí mismo correctamente, me pregunto si valdrá la pena intentar hacerlo uno mismo?

// Saludos
Responder Con Cita
  #8  
Antiguo 22-10-2003
cso2000 cso2000 is offline
Miembro
 
Registrado: may 2003
Ubicación: Guadalajara, Jalisco
Posts: 108
Poder: 22
cso2000 Va por buen camino
Si de hecho eso estaba pensando, Solo que como me ocurre lo mismo con aplicaciones como excel y word supuse que algo estaria haciendo mal


Como sea Gracias
Responder Con Cita
  #9  
Antiguo 22-10-2003
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
Vamos a ver una cosa.

¿Es realmente necesario el uso de AttachThreadInput?

El código que utilizas lo usé yo en otro contexto: el de evitar que una aplicación se ejecute más de una vez simultáneamente.

En ese caso fue necesario por la siguiente razón (al menos es lo que creo entender):

El código de activación (el que usa AttachThreadInput) se ejecuta en la primera instancia de la aplicación en un momento en que ésta no tiene el foco (el foco lo tiene la segunda instancia). Dicho de otra forma, es un código que se ejecuta desde un hilo distinto al que tiene el foco.

En tu caso, según entiendo, es distinto-- el código de activación se ejecuta desde tu aplicación que es la que tiene el foco. En ese caso siento que no deberías tener problemas con métodos más sencillos de activación.

El siguiente código lo acabo de probar y activa correctamente tanto IE como en MSWord:

Código:
var
  AppHandle: HWnd;

begin
  AppHandle := FindWindow(nil, AppName);
  if AppHandle <> 0 then
    if IsIconic(AppHandle)
      then ShowWindow(AppHandle, SW_RESTORE)
      else SetForegroundWindow(AppHandle);
Claro que tú estás obteniendo el "Handle" de las aplicaciones de otra forma pero eso no afecta.

Pruébalo así a ver si te sirve.

// Saludos

pd: Esto sólo lo he probado en Windows 2000
Responder Con Cita
  #10  
Antiguo 22-10-2003
cso2000 cso2000 is offline
Miembro
 
Registrado: may 2003
Ubicación: Guadalajara, Jalisco
Posts: 108
Poder: 22
cso2000 Va por buen camino
Saludos de Nuevo


no se si algo estoy haciendo mal


uso este codigo y no me funciona


[code]

var
AppHandle: HWnd;

begin
AppHandle := FindWindow(nil, 'IEXPLORE.EXE' );
if AppHandle <> 0 then
if IsIconic(AppHandle)
then ShowWindow(AppHandle, SW_RESTORE)
else SetForegroundWindow(AppHandle);

]/Code]


Estoy utilizando:

delphi3 y windows 2000
delphi3 y windows 98

y en ninguno me funciona

solo me falta probar con win 2000 y delphi 6


ayuda por favor
Responder Con Cita
  #11  
Antiguo 22-10-2003
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:
Posteado originalmente por cso2000
AppHandle := FindWindow(nil, 'IEXPLORE.EXE' );

[...]

solo me falta probar con win 2000 y delphi 6
Ni te gastes, tampoco te va a funcionar.

El parámetro que le pasas a FindWindow es el título de la ventana y no el del ejecutable, por ejemplo:

'Foros Club Delphi - Responder al tema - Microsoft Internet Explorer'.

Yo te puse FindWindow sólo por dar un ejemplo rápido para encontrar el "Handle" de una ventana (del IE en este caso). Cuando uses EnumWindows, el Handle que te pasa en la función callback es el que usarás en las llamdas a IsIconic, ShowWindow y SetForegroundWindow.

// Saludos
Responder Con Cita
  #12  
Antiguo 22-10-2003
cso2000 cso2000 is offline
Miembro
 
Registrado: may 2003
Ubicación: Guadalajara, Jalisco
Posts: 108
Poder: 22
cso2000 Va por buen camino
Tal vez tengo algun problema al obtener el Handle de la aplicacion porque no me finciona


ojala se no ocurruera otra cosa


Gracias
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


La franja horaria es GMT +2. Ahora son las 19:54:17.


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