Получение ручек окна Delphi - PullRequest
6 голосов
/ 11 сентября 2009

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

Ответы [ 3 ]

13 голосов
/ 11 сентября 2009

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

Вы можете угадать , ища окна с "main" в их именах классов, но даже если вы найдете такое, нет гарантии, что есть только один его экземпляр. В приложениях может быть несколько окон верхнего уровня, и в этом случае не имеет смысла назначать какое-либо одно из них «основным».

4 голосов
/ 11 сентября 2009

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

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

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

Чтобы проверить имя класса произвольного дескриптора окна (например, в функции обратного вызова, которую вы используете с 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

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

1 голос
/ 11 сентября 2009

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...