![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Как получить хэндл главной формы ЧУЖОГО приложения [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]Ммм...
Для ответа на вопрос надо бы ещё и озвучить причину, для чего это надо?
От цели многое зависит.