Получение Дескрипторов Окон Delphi

Я пытаюсь получить дескрипторы окон для приложения Delphi из внешнего приложения. Я вижу, что создано несколько окон (TApplication, TFrmMain и несколько других), и я знаю, что TApplication является "контроллером", но никогда не отображается. Однако могу ли я прочитать, Что такое значение для реального окна? Я знаю ,что это TFrmMain (для этого конкретного приложения), но можно ли это как-то понять? Информация, хранящаяся в свойствах окна, или где-то еще? Спасибо!

3 ответов


нет, нет документированного способа узнать, какой из окон представляет Application.MainForm извне приложения. В более новых версиях Delphi дескриптор окна основной формы не обязательно Application.MainForm.Handle в любом случае; приложения могут обрабатывать OnGetMainFormHandle событие для возврата того, что они хотят - это используется для выбора родительского окна для модальных диалогов.

вы можете Угадай путем искать окна с "главным" в их именах класса, но даже если вы находите одно, то никакое гарантирую, что это только один случай. Приложения могут иметь несколько окон верхнего уровня, и в этом случае нет смысла назначать какое-либо из них "основным".


имя класса любой Delphi form также является зарегистрированным именем класса окна базового "окна Windows". Таким образом, вы должны иметь возможность использовать FindWindow() вызов Windows API, чтобы получить дескриптор окна TFrmMain немного что-то вроде:

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

Если существует (потенциально) несколько экземпляров данного имени класса формы, вы можете различать их, используя 2-й параметр (имя окна, т. е. "заголовок" или заголовок). Если этого все еще недостаточно, тогда вам может потребоваться немного более сложный и посмотреть на использование EnumWindows () функция и проверка свойств окон, чтобы найти тот, который представляет интерес.

чтобы проверить имя класса дескриптора окна arbirary (например, в вашей функции обратного вызова, которую вы используете с функция enumwindows()), используйте GetClassName (), электронной.г:

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

без конкретных деталей вашего конкретного трудно сказать, что, скорее всего, будет работать лучше для вас, но, надеюсь, этого должно быть достаточно, чтобы вы двигались по правильному пути.


Я обычно использую WinDowse чтобы помочь мне начать работу, но тогда вы должны использовать функции API, как описано Deltics.