![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
HWND -> PControl [Delphi, Windows]
vampir_infernal © (2006-10-10 14:59:00)Матчасть: Delphi 2005 Upd 3 + KOL 2.39.1, WinXP SP2;
Проблема: Существует окно "чужого" приложения, есть его handle, полученный из FindWindow. Необходимо наследовать свое окно от него с использованием чистого KOL, по аналогии с CreateParented(ParentWin: HWND) из VCL. Перерыл весь KOL.pas, нашел наследование только от PControl.
Вопрос: как привести handle к типу PControl ( PControl(ParentWin) не помогает)? если есть другие варианты подобного наследования, с удовольствием их выслушаю.
alex3 (2006-10-12 22:26:00) [1]Попробуйте, при создании окна, назначать стили(атрибуты), расширенные в том числе. А потом проверте что у вас получится (любой прогой, читающей атрибуты окна). В принципе, можно добится то вего, чего хочеш, было бы желание влазить все дальше в дебри.
Barloggg (2006-10-12 09:00:00) [2]ну да, хозяин Lister. правильно.
я это и имел ввиду.
плагин Speller'а работает и нормально работает. правда двигать окно листера мне как-то в голову даже не приходило...
alex3 (2006-10-11 21:53:00) [3]>и в углу экрана мое окно без заголовка
коряво отрабатываются координаты окна,
мне так кажется, что коодината Left не правильно
пересчитывается (позиция на форме - позиция на экране).
При постоянном обновлении (перерисовки), и перемещении хозяина, внедренное окно ездит форме, причем top остается прежним.
Иногда бывает мерцание- внедренная форма рисуется в двух
местах, вызывается перемещением формы хозяина по экрану.
При изменении любой координаты внедренной формы рушатся все
остальные координаты. Измените хотя бы одну, и прочитайте все
остальные, получится очень интересно.
P.S.
Форма хозяин не TotalCommander (в моем случае).
vampir_infernal (2006-10-11 16:44:00) [4]спасибо. признаюсь, не правильно выразил мысль.
Barloggg (2006-10-11 09:04:00) [5]ха. это не наследование.
это использование даного тебе хендла как родителя.
с помощью KOL плагин с тоталкомандеру сделал Speller. спроси у него тонкости реализации.
здесь: http://speller.narod.ru/
vampir_infernal (2006-10-10 21:12:00) [6]Мне известны все параметры, используемые при создании "чужого" окна, то есть имя класса, стили, шрифты. Для ясности поясню, что "чужое" окно - это окно Lister в TotalCommander (а мое окно - плагин к нему).
С помощью GetWindowLong я получаю его оконную процедуру, перекрываю ее. Работает. Но необходимо именно наследовать от него. Писал на VCL - появлялось окно с заголовком и меню листера и моей формой вместо рабочей области (то, что нужно). Пишу на KOL, появляется окно листера и в углу экрана мое окно без заголовка. Пока что склоняюсь к ручной подгонке моего окна под координаты окна листера с соответсвующей обработкой сообщений.
Barloggg (2006-10-10 17:59:00) [7]е это не то. хедл это лишь адрес, где хранятся данные.
а обращение к скажем процедуре canvas.fillrect означает выхов функции которая должна находиться скажем +15 байт от координат этого хендла.
и если все правильно, то там действительно оказывается нужная нам инфа.
а если это не канвас, а что-то другое, то мы получаем access violation или нечто подобное.
короче еслиу тебя есть весь исходник и 100% таже структура как и у вражеского окна, ты можешь подхватить его хендл как свой и пользоваться им как своим собственным.
но если у тебя есть несостыковка в структуре, то будет (|). а может быть даже (___|___).
вот так-то.
я твой вопрос понял так, что ты имеешь лишь хендл и по нему хочешь узнать всю линию жизни вражеского приложения. так не выйдет. тебе нужно знать полную структуру класса, а для этого в идеале нужен исходник.
vampir_infernal (2006-10-10 15:51:00) [8]По хэндлу окна можно получить о ней очень много данных, вплоть до ее оконной процедуры.
Становится непонятным то, что такое наследование свободно применяется в VCL. Похоже, придется запастись временем и окунуться в мир Source\vcl. :(
Barloggg (2006-10-10 15:21:00) [9]никак.
чтобы чего-нибудь от чего-нибудь наследовать надо знать про него все, а не только хендл.
максимум что ты можешь сделать это прицепиться к его хендлу и положить свой компонент на него (возможно)
а вот если у тебя есть полная конструкция класса (исходник), тогда другой разговор, тогда кое-что можно сделать. в принципе.