Club Delphi  
    Paypal   FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Principal > API de Windows
Registrarse FAQ Miembros Calendario Guía de estilo Buscar Temas de Hoy Marcar Foros Como Leídos

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 18-06-2012
Avatar de escafandra
[escafandra] escafandra is offline
Miembro Premium
 
Registrado: nov 2007
Posts: 2.211
Poder: 22
escafandra Tiene un aura espectacularescafandra Tiene un aura espectacular
Quizás esto te de pistas:

Código Delphi [-]
procedure ListWinInfoFromPId(PId: DWORD; Strings: TStrings);
type
  TWinParam = record
    Handle: THandle;
    PId: DWORD;
  end;
  PWinParam = ^TWinParam;
var
  WinParam: TWinParam;
  Buffer: array [1..255] of char;

  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.PId:= PId;
  EnumWindows(@EnumWindowsProc, LPARAM(@WinParam));
  Strings.Clear;
  repeat
    Strings.Add('hWnd: ' + IntToHex(WinParam.Handle, 8));
    GetWindowText(WinParam.Handle, @Buffer, 255);
    Strings.Add('Caption: ' + Buffer);
    GetClassName(WinParam.Handle, @Buffer, 255);
    Strings.Add('Clase: ' + Buffer);
    Strings.Add('-----------------------------------------------');
    WinParam.Handle:= Windows.GetParent(WinParam.Handle);
  until WinParam.Handle = 0;
end;

Ejemplo de uso:
Código Delphi [-]
ListWinInfoFromPId(4800, Memo1.Lines);


Saludos.
Responder Con Cita
  #2  
Antiguo 18-06-2012
Avatar de escafandra
[escafandra] escafandra is offline
Miembro Premium
 
Registrado: nov 2007
Posts: 2.211
Poder: 22
escafandra Tiene un aura espectacularescafandra Tiene un aura espectacular
Y mejor de esta otra forma:

Código Delphi [-]
procedure ListWinInfoFromPId(PId: DWORD; Strings: TStrings);
type
  TWinParam = record
    PId: DWORD;
    S: TStrings;
  end;
  PWinParam = ^TWinParam;
var
  WinParam: TWinParam;

  function EnumWindowsProc(Handle: Thandle; lParam: LPARAM): BOOL; stdcall;
  var
    PId: DWORD;
    Buffer: array [1..255] of char;
  begin
    Result:= true;
    PId:= 0;
    GetWindowThreadProcessId(Handle, PId);
    if PWinParam(lParam).PId = PId then
    begin
      PWinParam(lParam).S.Add('hWnd: ' + IntToHex(Handle, 8)+'h');
      GetWindowText(Handle, @Buffer, 255);
      PWinParam(lParam).S.Add('Caption: ' + Buffer);
      GetClassName(Handle, @Buffer, 255);
      PWinParam(lParam).S.Add('Clase: ' + Buffer);
      PWinParam(lParam).S.Add('-----------------------------------------------');
      Result:= true;
    end;
  end;

begin
  Strings.Clear;
  WinParam.PId:= PId;
  WinParam.S:= Strings;
  EnumWindows(@EnumWindowsProc, LPARAM(@WinParam));
end;

Con el mismo ejemplo de uso:

Código Delphi [-]
ListWinInfoFromPId(4800, Memo1.Lines);


Saludos.

Última edición por escafandra fecha: 18-06-2012 a las 12:27:05.
Responder Con Cita
  #3  
Antiguo 18-06-2012
Joviali Joviali is offline
Miembro
 
Registrado: may 2006
Posts: 22
Poder: 0
Joviali Va por buen camino
Buenas,
La funcion que me has pasado me ha ayudado mucho, por cierto he tenido que cambiar esto para que funcione

Código Delphi [-]GetWindowThreadProcessId(Handle, PId);
por GetWindowThreadProcessId(Handle,@ PId);



La funcion me ha devuelto mas informacion de la que esperaba y me ha surgido la siguiente duda.
¿Puedo preguntar si la Clase TF_MULTICONSULTA es una calse class(TForm) ?.Esto me ayudaria ya
que me mostraria solo los formularios de la aplicacion.

hWnd: 000202B6h
Caption: MultiConsulta
Clase: TF_MULTICONSULTA
-----------------------------------------------
hWnd: 000102B0h
Caption: Aplicación Servidor -
Clase: TF_Principal
-----------------------------------------------
hWnd: 000202A2h
Caption:
Clase: TfrProgressForm
-----------------------------------------------
hWnd: 00060248h
Caption: Servidor -
Clase: TApplication
-----------------------------------------------
hWnd: 011B04D2h
Caption:
Clase: ComboLBox
-----------------------------------------------
hWnd: 000102CAh
Caption:
Clase: TPUtilWindow
-----------------------------------------------
hWnd: 000102C8h
Caption:
Clase: TPUtilWindow
-----------------------------------------------
hWnd: 000102C6h
Caption:
Clase: TPUtilWindow
-----------------------------------------------
hWnd: 000102C4h
Caption:
Clase: TPUtilWindow
-----------------------------------------------
hWnd: 000102C2h
Caption:
Clase: TPUtilWindow
-----------------------------------------------
hWnd: 000102C0h
Caption:
Clase: TPUtilWindow
-----------------------------------------------
hWnd: 000102BEh
Caption:
Clase: TPUtilWindow
-----------------------------------------------
hWnd: 000102BCh
Caption:
Clase: TPUtilWindow
-----------------------------------------------
hWnd: 000102B4h
Caption:
Clase: TPUtilWindow
-----------------------------------------------
hWnd: 000102AEh
Caption:
Clase: TPUtilWindow
-----------------------------------------------
hWnd: 000102ACh
Caption:
Clase: TPUtilWindow
-----------------------------------------------
hWnd: 000102D8h
Caption: M
Clase: MSCTFIME UI
-----------------------------------------------
hWnd: 0004022Ch
Caption: Default IME
Clase: IME
-----------------------------------------------
Responder Con Cita
  #4  
Antiguo 19-06-2012
Avatar de escafandra
[escafandra] escafandra is offline
Miembro Premium
 
Registrado: nov 2007
Posts: 2.211
Poder: 22
escafandra Tiene un aura espectacularescafandra Tiene un aura espectacular
Cita:
Empezado por Joviali Ver Mensaje
...he tenido que cambiar esto para que funcione

Código Delphi [-]GetWindowThreadProcessId(Handle, PId);
por GetWindowThreadProcessId(Handle,@ PId);
Me extraña, al menos en mi delphi 7 el PID se para por referencia aunque la API usada en C/C++ recibe un pintero.

En principio estás explorando ventanas con la API, de cualquier APP. Sólo las aplicaciones basadas en la VCL tienen ventanas del tipo TForm. No se debe confundir la Clase de POO con la clase de ventana de windows, que no tiene nada que ver con la POO.

La VCL da nombres de clase de ventana (WindowClass) similares a los de la clase POO lo que ayuda al explorar ventanas de una APP escrita en delphi o Builder. Esto puede aproximarte a tu duda.

Puedes saber mas de las ventanas con otras API. Estudia GetWindowLong. Con ella sabrás los estilos de ventada y deducir si la ventana que buscas es un TForm, pero nunca estarás seguro de ello con esta función.


Saludos.
Responder Con Cita
  #5  
Antiguo 19-06-2012
Joviali Joviali is offline
Miembro
 
Registrado: may 2006
Posts: 22
Poder: 0
Joviali Va por buen camino
Puede que sea porque uilizo para este proyecto delphi 5

Al final voy a coger las clases y meterlas en una lista y comparla con otra lista de clases con el programa en reposo.De esta manera sabre si la APP este en el menu principal.Creo que con esto esta solucionado.
Una pregunta más cuando voy a guardar el buffer de la clase en un string me aperele lo siguiente:
TF_MULTICONSULTA'#0'’|º¡’|'#0#0#$15#0'`'#0#0'@]'#0'’|ð '#$16#0'#'#0#0'À-ÿ‘|ÿÿÿÿË£’|º¡’|'#0#0#$15#0'`'#0#0'@]'#0'’|'#0#0#0#0'-ÿ‘|ô'#3#3#0#0#0#0#0#1#0#0#0#0#0#$15#0'Äð'#$12#0#0#0'É'#0'”ó'#1#0' '#0#0#0'8ò'#$12#0'0ó'#$12#0'”ó'#$12#0' é‘|`'#0'’|ÿÿÿÿ]'#0'’|¬'#4'’|'#0#0#$15#0#0#0#0#0#$10#$17#$16#0#$18'ó'#$12#0'‚'#4'’|'#$10#$17#$16#0#0#0#$15#0#0#0#0#0 #0#0#0#0#0#0#0#0'üó'#$12#0'b4@'#0'þ!'#0#0#0#0#$15#0',ñ'#$12#0#0#0#$15#0'¦¥:~`ó:~'#0#0#0#0#0#0#0#0#0# 0#0#0#0#0#0#0'Ê'#0#0#0'`q'#$16#0'pó'#$12#0'ì'#$1B'£'#0'„õ'#$12#0'ø'#$C#0#0




. He intentando lipiarlo y dejar lo que me interesa(TF_MULTICONSULTA) con funciones que limpiar caracteres dobles, tambien con la siguiente funcion:
Código Delphi [-]function TFORM1.QuitarCaracteres(Str: String): String; var i: Integer; begin Result:= EmptyStr; for i:= 1 to Length(Str) do if (Str[i] < #123)AND(Str[i] > #64) then Result:= Result + Str[i]; end;




y no hay manera siempre me encuentro algo de basura en algun caso.¿Se te ocurre algo?
Responder Con Cita
  #6  
Antiguo 20-06-2012
Joviali Joviali is offline
Miembro
 
Registrado: may 2006
Posts: 22
Poder: 0
Joviali Va por buen camino
Perdon por el mensaje anterior, ya he solocionado el problema de la cadena con basura .Muchas gracias por haberme pasado esa funcion.
Responder Con Cita
Respuesta


Herramientas Buscar en Tema
Buscar en Tema:

Búsqueda Avanzada
Desplegado

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
For a todas las ventanas abiertas. rauros Varios 1 03-08-2008 22:07:59
Cerrar todas las Ventanas MDIChild gluglu OOP 11 18-04-2007 20:12:56
Recoger Información de Balanza altp Varios 4 22-08-2005 21:26:32
Minimizar todas las ventanas santiago14 Varios 2 17-09-2004 03:34:01
minimizar todas las ventanas. soyhugo Varios 2 18-02-2004 13:11:26


La franja horaria es GMT +2. Ahora son las 14:30:18.


Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2026, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi
Copyright 1996-2007 Club Delphi