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

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

Как определить тип окна? [D7, Win95/98, WinME, NT4, Win2k, WinXP]


arbiter ©   (2004-02-12 16:47:00) 

Как имея только хэндл окна, определить его тип (CheckBox, Button, ListBox, etc)?


andry1981   (2004-02-14 03:57:00) [1]

В принципе у этих окон есть ID, но он везде =0.
Так всё таки, как решить эту проблемку?
Может возможен другой подход?


MBo   (2004-02-13 15:31:00) [2]

> в режиме Design-time.
А, вот это о чем речь....


Игорь Шевченко   (2004-02-13 14:46:00) [3]

MBo ©   (13.02.04 14:33)

Имеются в виду значки невизуальных компонентов, насколько я понимаю. Они действительно являются дочерними окнами в режиме Design-time.


andry1981   (2004-02-13 14:39:00) [4]

Дело в том, что система реагирует на них как на дочерние окна, когда я их размещаю.


MBo   (2004-02-13 14:33:00) [5]

>andry1981
??? О чем ты?
TTable и TDataSet - не окна, и даже не контролы, а просто классы.


andry1981   (2004-02-13 14:28:00) [6]

Кстати, у меня возникла подобная проблема.
Нужно определить любое свойство окна (чужой программы), которое его однозначно характеризует.
Пример: моя независимая прога ловит сообщения, когда я работаю в Delphi. Я размещаю компоненты на форме Table класса TTable и DataSet класса TDataSet (такие классы у них в Delphi). Срабатывает сообщение WM_CREATE для окна. Я его обрабатываю и пытаюсь получить параметры. Казалось бы, что GetClassName должно было возвратить мне эти самые класы. Но вся проблема в том, что я получаю в обеих случаях класс TContainer и всё тут.
Кто посоветует, как мне можно различить эти два компонента. Caption у них пустой, а стили и прочие характеристики - одинаковые (кроме хэндлов).


Игорь Шевченко   (2004-02-13 12:46:00) [7]

arbiter ©   (13.02.04 12:41)

В общем случае - конечно. По Handle ты можешь определить размеры, стили, имя класса, и т.д. - функций много. Но определить гарантировано, что окно будет обрабатывать те или иные сообщения в общем случае ты не можешь.


arbiter   (2004-02-13 12:41:00) [8]

> Игорь Шевченко ©   (13.02.04 09:57) [5]

Ты хочешь сказать что различия между окнами сводятся не к каким то их параметрам, а только к оконной процедуре?

И вычислить принадлежность окна к какому либо типу (базовому) можно только проследив цепочку вызовов оконных процедур? Что в общем то не представляется возможным (вернее представляется очень трудоёмким и ненадёжным).


Игорь Шевченко   (2004-02-13 09:57:00) [9]


> Я не привязываюсь к VCL, я вообще ни к чему не привязываюсь,
> у меня есть только Handle, и я хочу определить тип окна
> (чтобы знать в частности какие сообщения можно этому окну
> посылать).


Голову включаем. После этого процесса понимаем, что задача абсолютно невыполнимая в общем случае. Ты можешь посылать сообщения только из того набора, который является общим для всех окон, и то, не всегда успешно, так как оконная процедура конкретного окна может обрабатывать ЛЮБЫЕ сообщения так, как ей заблагорассудится (точнее, как заблагорасудится тому программисту, который ее писал).


arbiter   (2004-02-12 18:51:00) [10]

абсолютно необязательно...

у CheckBox может быть как TCheckBox, так и Button (если окно создано функцией DialogBox), так и VasyaPupkinCoolCheckBox.

Я не привязываюсь к VCL, я вообще ни к чему не привязываюсь, у меня есть только Handle, и я хочу определить тип окна (чтобы знать в частности какие сообщения можно этому окну посылать).


clickmaker   (2004-02-12 18:31:00) [11]


> arbiter ©   (12.02.04 17:18) [2]

Ну дык, соотвессно у чек бокса будет TCheckBox, у списка TListBox


arbiter   (2004-02-12 17:18:00) [12]

1. GetClassName не подходит... оно может быть абсолютно любым для окна.
К примеру у Memo, имя класса = TMemo, а контрол тем временем = Edit.

2. Стили также не подходят, поскольку для разных типов контролов имеются стили с одинаковыми значениями.
К примеру BS_CHECKBOX = ES_RIGHT.


YuRock   (2004-02-12 17:08:00) [13]

1. The GetClassNamefunction retrieves the name of the class to which the specified window belongs.

2. CheckBox отличается от Button только наличием стиля BS_CHECKBOX (или BS_AUTOCHECKBOX)


Наверх

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