Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2009.10.25;
Скачать: CL | DM;

Вниз

Работа с функциями GetWindowLong, SetWindowLong   Найти похожие ветки 

 
stas ©   (2008-09-09 17:31) [0]

Нужно в невизуальном объекте обрабатывать сообщения посылаемые окну-родителю
Для этого делаю следующее:
1. Получаю с помощью функции GetWindowLong, оконную процедуру:
OldOnMsg:=(GetWindowLong (TForm(Owner).Handle,GWL_WNDPROC));

2. Создаю свою процедуру с определенным набором параметров:
Procedure OnMsg (HWND:hwnd;UINT: Longint;WPARAM:wParam;LPARAM:lparam);

3. В созданной процедуре с помощью CallWindowProc вызываю полученную оконную процедуру и дописываю свои команды:
procedure OnMsg(HWND: hwnd; UINT: Longint; WPARAM: wParam;LPARAM: lparam);
begin
CallWindowProc (Pointer(OldOnMsg),hwnd,uint,wparam,lparam);
//пока свой обработчик не писал
end;

4. С помощью процедуры SetWindowLong назначаю свою процедуру оконной:
SetWindowLong (TForm(Owner).Handle,GWL_WNDPROC,Integer(@OnMsg));

При запуске программы выводится Access Violation.
Возможно я что-то сделал не так в
Integer(@OnMsg) или в Pointer(OldOnMsg)

Подскажите в чем может быть проблема?

Заранее благодарен.


 
Renegat ©   (2008-09-09 17:33) [1]

А возвращённый результат вы, надо полагать, присваиваете переменной OnOldMsg? или где?


 
stas ©   (2008-09-09 17:34) [2]

Renegat ©   (09.09.08 17:33) [1]
Возвращенный результат какой функции Set ?


 
Renegat ©   (2008-09-09 17:34) [3]

*результат, возвращённый функцией SetWindowLong


 
Renegat ©   (2008-09-09 17:34) [4]

ибо Get тут в принципе и не нужен


 
stas ©   (2008-09-09 17:35) [5]

не присваеваю.

т.е. надо так:
OldOnMsg:= SetWindowLong (TForm(Owner).Handle,GWL_WNDPROC,Integer(@OnMsg));

При этом Get неиспользовать?


 
Renegat ©   (2008-09-09 17:36) [6]

а процедуре нужно добавить директиву stdcall;
и вообще сделать её функцией с выходным параметром Интегер.


 
stas ©   (2008-09-09 17:39) [7]

Спасибо, программа теперь запустилась, но похоже окно не обрабатывает сообщения. Щас еще сам поразбираюсь, неразберусь - напишу.


 
Renegat ©   (2008-09-09 17:40) [8]

Ибо Винда вызывает ваш обработчик, пихая все парамы в стек, а согласно делфяной директиве __fastcall первые три парама вызывающий парсит через регистры ЦП. В итоге, все парамы перемешивается и после вызова рушится стэк. Отсюда и AV.
зы. а результат CallWindowProc надо присваивать результату вашего обработчика. и вообще явно выдавать результат при обработке любой мессаги.


 
stas ©   (2008-09-09 17:41) [9]

Renegat ©   (09.09.08 17:40) [8]
Спасибо! все заработало.


 
Юрий Зотов ©   (2008-09-09 20:18) [10]

> Нужно в невизуальном объекте обрабатывать сообщения посылаемые
> окну-родителю

У невизуального объекта никакого окна-родителя нет и быть не может.


 
stas ©   (2008-09-09 21:12) [11]

Юрий Зотов ©   (09.09.08 20:18) [10]
*Окну - владельцу. Овнеру короче.


 
DVM ©   (2008-09-09 21:27) [12]

procedure OnMsg(HWND: hwnd; UINT: Longint; WPARAM: wParam;LPARAM: lparam);

Первый раз вижу такое объявление. Все шиворот навыворот. Плюс путаница.

Трудно было по человечески cделать что ли:

function WndProc(hWnd: HWND; Msg: UINT; wParam: WPARAM; lParam: LPARAM): LRESULT; stdcall;


 
DVM ©   (2008-09-09 21:30) [13]


> stas ©   (09.09.08 17:31)  

Оконная процедура только называется процедурой, но на деле это функция, которая обязана возвращать результат ВСЕГДА. А все необработанные сообщения передавать оконной процедуре по умолчанию или старой оконной процедуре. У тебя же бред сивой кобылы написан.


 
Юрий Зотов ©   (2008-09-09 21:32) [14]

> stas ©   (09.09.08 21:12) [11]

Это уже теплее. Но владелец (Owner), во-первых, есть не у всех объектов. Во-вторых, им является не окно, а компонент.

Посмотрите MakeObjectInstance. Примеры использования есть в VCL.


 
stas ©   (2008-09-09 21:53) [15]

DVM ©   (09.09.08 21:30) [13]
Ну, я вобщето и спросил что неправильно. и уже давно разобрался
stas ©   (09.09.08 17:41) [9].

Юрий Зотов ©   (09.09.08 21:32) [14]
Это будет компонент, который будет лежать только на форме, а если овнер не форма, то он работать не будет есть проверка на класс, да и вобще он без формы смысла не имеет.


 
stas ©   (2008-09-09 21:55) [16]

Всем спасибо за участие.


 
Юрий Зотов ©   (2008-09-09 22:02) [17]

> stas ©   (09.09.08 21:53) [15]

1. Это и так было понятно, потому что вопрос достаточно специфичный. Но желательно все же формулировать вопросы точнее, потому что из-за неточностей очень часть возникают разночтения и путаница.

2. Таких компонентов написано уже немало, их методика давно отработана - почему я и советую посмотреть MakeObjectInstance.


 
stas ©   (2008-09-10 08:51) [18]

Юрий Зотов ©   (09.09.08 22:02) [17]

1. Сргласен.
2. Спасибо, посмотрю.


 
stas ©   (2008-09-10 16:46) [19]

Юрий Зотов ©   (09.09.08 22:02) [17]

Прочитал о MakeObjectInstance. Как раз то что мне нужно, спасибо!



Страницы: 1 вся ветка

Текущий архив: 2009.10.25;
Скачать: CL | DM;

Наверх




Память: 0.51 MB
Время: 0.023 c
15-1251132830
Igor5
2009-08-24 20:53
2009.10.25
переход по формам в случайном порядке


15-1250899237
Tirael
2009-08-22 04:00
2009.10.25
как называется игрушка


11-1206746346
kns
2008-03-29 02:19
2009.10.25
findcomponent


15-1251232204
Юрий
2009-08-26 00:30
2009.10.25
С днем рождения ! 26 августа 2009 среда


2-1251902073
Merlin_88
2009-09-02 18:34
2009.10.25
Помогите с Классами