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
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".
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.
Normalmente uso WinDowse para ayudarme a comenzar, pero luego tiene que usar las funciones de la API tal como se describe en Deltics.
- 1. palabras e identificadores reservados de Delphi
- 2. Delphi: Mostrar ventana sin activación
- 3. Enumeración de identificadores de archivo en C#
- 4. Comparar identificadores de versión
- 5. Android - Recuperación de AlarmManager
- 6. ¿Recuperación inteligente de Vim?
- 7. DELPHI IDE - Detener F12 de abrir el 'CPU' Ventana
- 8. Cómo deshabilita la ventana de la CPU en Delphi 7
- 9. Error de recuperación de memoria
- 10. Identificadores de nodo en neo4j
- 11. MATLAB: Fusionar identificadores de función
- 12. Recuperación de VisualSVN con TortoiseSVN
- 13. jquery.ajax recuperación de datos múltiples
- 14. Tratar con identificadores de entidad de diseño de objetos
- 15. Análisis de Java de identificadores de puntos
- 16. Obtener identificadores para todas las ventanas de un proceso
- 17. Impacto de los identificadores de cuenta AWS
- 18. Recuperación de archivos eliminados de Xcode
- 19. duración y tiempo de recuperación de mysql
- 20. genéricos de Java - tipo de recuperación
- 21. Scapy - recuperación de RSSI de paquetes WiFi
- 22. Restablecer el estado de recuperación de contraseña
- 23. Recuperación de una migración fallida de Rails
- 24. Recuperación de URL de SharePoint para SPListItem
- 25. Recuperación de una base de datos fallida
- 26. recuperación de la contraseña de acceso MDB
- 27. Recuperación de comentarios de un DB PostgreSQL
- 28. Orden de inserción y recuperación de ArrayList
- 29. recuperación mnesia línea de partición de red
- 30. Cómo utilizar los mensajes de foco de ventana para un formulario de teclado en pantalla Delphi
Gracias, tenía miedo de eso. :( –