2009-09-11 13 views
6

Estoy tratando de obtener los identificadores de ventana para una aplicación Delphi desde una aplicación externa. Puedo ver que hay algunas ventanas creadas (TApplication, TFrmMain y algunas otras), y sé que TApplication es el "controlador", pero nunca es visible. Sin embargo, ¿puedo leer cuál es el valor de la ventana real? Sé que es TFrmMain (para esta aplicación específica), pero ¿es posible resolver esto de alguna manera? ¿La información está almacenada en las propiedades de la ventana o en otro lugar? ¡Gracias!Recuperación de identificadores de ventana de Delphi

Respuesta

11

No, no hay una forma documentada para descubrir cuál de las ventanas representa Application.MainForm desde el exterior de la aplicación. En las versiones más nuevas de Delphi, el identificador de ventana de la forma principal no es necesariamente Application.MainForm.Handle; las aplicaciones pueden manejar el evento OnGetMainFormHandle para devolver lo que quieran, que se usa para elegir la ventana principal para los cuadros de diálogo modales.

Puede suponer buscando ventanas con "main" en sus nombres de clase, pero incluso si encuentra una, no hay garantía de que solo haya una instancia de la misma. Las aplicaciones pueden tener varias ventanas de nivel superior, en cuyo caso no tiene mucho sentido designar a ninguna de ellas como "principal".

+0

Gracias, tenía miedo de eso. :( –

4

El nombre de la clase cualquier forma Delphi es también el nombre de clase de ventana registrada de la "ventana de Windows" subyacente. Por lo que debe ser capaz de utilizar el FindWindow() llamada a la API de Windows para obtener el identificador de ventana de TFrmMain un poco algo como:

hWnd := FindWindow('TFrmMain', NIL); 

Si hay (potencialmente) múltiples instancias de un nombre de clase de forma dada a continuación, es posible que pueda para distinguir entre ellos usando el 2do parámetro (Nombre de la ventana, es decir, "título" o título). Si aún así no es suficiente, puede que necesite un poco más de sofisticación y utilizar la función EnumWindows() y verificar las propiedades de las ventanas para encontrar la que le interesa.

Para comprobar el nombre de clase de un identificador de ventana arbirary (por ejemplo, en su función de devolución de llamada que se utiliza con EnumWindows()), utilizar GetClassName(), por ejemplo:

function GetWindowClassName(const aHWND: HWND): String; 
var 
    buf: array[0..255] of Char; // Tip: Use a more appropriately sized array 
begin 
    GetClassName(SomeHWND, @buf, Length(buf)); 
    result := buf; 
end; 

... 

if SameText(GetWindowClassName(hwnd), 'TFrmMain') then 
    ... 

etc 

Sin detalles específicos de su desafío implementación particular es difícil decir cuál es la mejor opción para ti, pero espero que eso sea suficiente para que vayas por el camino correcto.

1

Normalmente uso WinDowse para ayudarme a comenzar, pero luego tiene que usar las funciones de la API tal como se describe en Deltics.

Cuestiones relacionadas