![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
не определяется хендл дочернего окна [D7, Win2k]
alex732 © (2004-08-31 10:26:00)Добрый день, Мастера! Такая задача: Есть приложение Progs форма ProgsWindow которго содержит TMemo - Memo1... необходимо в это мемо передать из другого приложения некий текст - к примеру 'TEST' и показать эту форму... Я делаю следующим образом:
PHandle := FindWindow(nil, 'ProgWindow');// нахожу хендл окна по названию
if PHandle <> 0 then
begin
CHandle := FindWindowEx(PHandle, 0, nil, 'Memo1'); //пытаюсь найти хендл дочернего окна
SetWindowText(CHandle, PChar('TEST'));
ShowWindow(PHandle,SW_SHOWNORMAL);
end;
Но не определяется CHandle... Он остается = 0... Почему? Расскажите ПЛИЗЗ!
GrayFace (2004-08-31 18:21:00) [1]Можно GWL_USERDATA менять.
alex732 (2004-08-31 18:18:00) [2]Все получилось! Спасибо всем, кто помогал!
GuAV (2004-08-31 15:35:00) [3]
> Порядок в EnumChildWindows зависит от Z-order'а дочерних
> окон, так что если его никто не меняет от запуска к запуску,
> то порядок будет один и тот же.
Тогда понятно. То, что Z-order в VCL сохраняется - это даже я вижу :)
> Но вроде, для связи двух своих программ можно и попроще
> метод придумать.
Здесь Ваше если :)
> если обе программы ЕГО
Игорь Шевченко (2004-08-31 15:10:00) [4]GuAV © (31.08.04 15:00) [7]
Порядок в EnumChildWindows зависит от Z-order'а дочерних окон, так что если его никто не меняет от запуска к запуску, то порядок будет один и тот же. Но вроде, для связи двух своих программ можно и попроще метод придумать.
GuAV (2004-08-31 15:00:00) [5]А не можно ли рассчитывать на то что порядок в EnumChildWinows будет одинаковым?
Игорь Шевченко (2004-08-31 14:33:00) [6]inic © (31.08.04 13:12) [5]
> Конечно, если программа ProgsWindow - принадлежит alex732,
> то он может ее переделать с указанием четких ID
Сомневаюсь, что это ему поможет, так как Handle ему и надо найти, а если ID ему равен, то что аргумент для поиска неизвестен. Я думаю, что если обе программы ЕГО, то можно предусмотреть сообщение, посылаемой главному окну чужой программы, результатом которого будет Handle нужного контрола :)
inic (2004-08-31 13:12:00) [7]Точно ?
Взглянул на сурсы, Нет...
Вот, что в Controls.pas: TWinControl.CreateWnd():
if (GetWindowLong(FHandle, GWL_STYLE) and WS_CHILD <> 0) and
(GetWindowLong(FHandle, GWL_ID) = 0) then
SetWindowLong(FHandle, GWL_ID, FHandle);
Из этого следует, что если мы где-то не задали ID для нашего компонента (например, в конструкторе), то его ID будет равен его хендлу.
Конечно, если программа ProgsWindow - принадлежит alex732, то он может ее переделать с указанием четких ID (боюсь придется сабклассить TMemo).
Игорь Шевченко (2004-08-31 11:55:00) [8]
> Судя по всему, по ID тоже искать бесполезно, ибо при каждом
> запуске он изменяется
Точно ?
inic (2004-08-31 11:15:00) [9]Судя по всему, по ID тоже искать бесполезно, ибо при каждом запуске он изменяется, тогда могу подсказать немного дурацкий способ - брать координаты всех мемо и искать например самый верхний или какой нужен.
alex732 (2004-08-31 10:48:00) [10]> inic
Похоже что так оно и есть... Попробовал поискать по классу - хендл определился... Тогда конкретизирую : на этой форме не одно, а два Мемо - Memo1 и Memo2... Как тогда мне послать текст в нужное мне - Memo1?
inic (2004-08-31 10:37:00) [11]Должен заранее сказать, что не уверен в ответе.
Вроде как Memo1 - это имя компонента, не более того (не имя окна в WinAPI понятии). А вот класс - TMemo, может по нему искать.