Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Как получить хэндл главной формы ЧУЖОГО приложения [D5, D6, D7, Win95/98, WinME, Win2k, WinXP]


Ale}{(is) ©   (2004-09-24 18:14:00) 

Уважаемые Мастера! Подскажите пожалуйста, как получить хэндл главной формы ЧУЖОГО приложения. Проблема в том, что приложение заранее неизвестно, поэтому пользоваться поиском по заголовку и имени класса окна нельзя. Более того, проблема усугубляется тем, что, например в Дэльфи, все формы (и главная и нет) имеют одного родителя – TApplication, т. е. нельзя перебрать все формы и выбрать из них ту, которая является предком для всех других. Заранее благодарен за помощь…


Digitman   (2004-09-29 11:02:00) [1]


> Ale}{(is)   (28.09.04 21:26) [12]


> А если нужно работать не только с Дэльфийскими формами?


а где ты ранее об этом упомянул ? в вопросе у тебя фигурирует TApplication, почему же мне не предположить, что под "чужим" приложением ты подразумеваешь только дельфийские и BCB-приложения ?


> По-моему - в Москву через Владивосток


это уж тебе решать


jack128   (2004-09-28 22:52:00) [2]

Ale}{(is)   (28.09.04 21:26) [12]
Советую еще раз прочитатьь первую строку в [7]

> получить глоб.атом, соотв.этому окну, по инф-ции из
> имени найденного атома определить адрес объекта
> TApplication
а можно ссылку на код?? А то в D5 я что то такого не вижу..


Ale}{(is)   (2004-09-28 21:26:00) [3]

А если нужно работать не только с Дэльфийскими формами? А если не известен копилятор? Теперь что, анализатор компилятора внедрять и для каждого из них свой алгоритм придумывать. По-моему - в Москву через Владивосток!


Digitman   (2004-09-27 08:49:00) [4]


> У Дэльфей все формы имеют родителя - TApplication


на основании чего такая святая уверенность ?


> получить хэндл главной формы ЧУЖОГО приложения


внедрить свой код в АП "чужого" приложения, найти окно класса TApplication, получить глоб.атом, соотв.этому окну, по инф-ции из имени найденного атома определить адрес объекта TApplication, получить св-во MainForm этого объекта


jack128   (2004-09-26 12:11:00) [5]

GuAV ©   (25.09.04 20:16) [8]
Application.Handle и Application.MainForm.Handle

У MainForm - родитель Application.
procedure TCustomForm.CreateParams(var Params: TCreateParams);
begin
   if (Parent = nil) and (ParentWindow = 0) then
   begin
     WndParent := Application.Handle;

> Хэндл окна хинта

Да, на это я не обратил внимание.. Для Delphi можно проверить на WS_EX_TOOLWINDOW, и то н всегда пройдет.. А так не знаю.. Вообще на RSDN была какая то статейка по поводу того, по какому алгоритму експлоерер создает кнопки на TaskBar'e для приложений.. Поищите - может поможет..(Хотя ИМХО, мало вероятно, что задача решаема в общем случае ;-) А в часном, завязывайся на класс и Caption, иначе никак.. )


Ale}{(is)   (2004-09-26 09:55:00) [6]

У Дэльфей все формы имеют родителя - TApplication, а мне нужно получить только одну!


GuAV   (2004-09-25 20:16:00) [7]


> Соответсвенно - EnumWindow + проверка, пренадлежит это окно
> твоему процессу или нет + проверка имеет это окно родителя...

И это найдёт Application.Handle и Application.Mainorm.Handle и Хэндл окна хинта ?


jack128   (2004-09-25 18:12:00) [8]

Главное окно - это термин юзера! У самой Windows нет никаких флагов говорящих о том - главное это окно или нет.
Другое дело, что в большенстве случаев главное окно не имеет родителя, вот на это можно и ориентироваться.
Соответсвенно - EnumWindow + проверка, пренадлежит это окно твоему процессу или нет + проверка имеет это окно родителя...


Cobalt   (2004-09-25 17:22:00) [9]

Да ну? У Application.Handle и Application.Mainorm.Handle одинаковые стили?


Ale}{(is)   (2004-09-25 15:02:00) [10]

Прикол в том, что первое, что я сделал - это я запустил WinSight и Spy - по стилям никаких отличий, что у главной, что у дочерней формы.
А то, что задача из области эвристического анализа - это верно: требования не конкретизированны...


Cobalt   (2004-09-25 11:05:00) [11]

помнится мне, у окон, которые фигурируют на панели задач - есть спец флаг в стилях, которые указывают на его Top-level'ость.
А вообще твоя задача - что-то из области эвристического анализа :( То есть требования не формализованы (в общем-то это половина решения)
Во-первых - конкретизируй, что ты понимаешь под главной формой. Если ты слабо себе представляешь - то бери в руки WinSight - и вперёд.


Ale}{(is)   (2004-09-25 10:07:00) [12]

[1] -->Задача, в общем, такая: нужно активизировать приложение (точно известно, что оно запущено), причём активизировать именно главную форму а не какую-нибудь другую. Проблема усугублена тем, что часть окон не имеет кнопки на панели задач, а имеет только иконку в трее.
[2] -->Есть список окон - проходили это. Имеется таблица, в первой графе имя окна, а во второй - PID создавшего процесса. А дальше, как вы правильно сказали - ХЗ, что с этим всем делать!


GanibalLector   (2004-09-24 22:26:00) [13]

Вообще-то findwindow ,но т.к. ничего нельзя,то ИМХО получить все видимые окна и хз что с ними делать.


Cobalt   (2004-09-24 20:14:00) [14]

Ммм...
Для ответа на вопрос надо бы ещё и озвучить причину, для чего это надо?
От цели многое зависит.


Наверх

Титульная страница Поиск, карта сайта Написать письмо