![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Как определить тип окна? [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)