Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 2009.10.25;
Скачать: [xml.tar.bz2];

Вниз

Работа с функциями 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;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.49 MB
Время: 0.051 c
2-1251130365
andru
2009-08-24 20:12
2009.10.25
Пояснения по теме интервейсы


2-1251362876
Polkin
2009-08-27 12:47
2009.10.25
Наведение мыши в потомке TLabel


2-1251683194
Johnnnn
2009-08-31 05:46
2009.10.25
Цветной текст ДЛЯ richedit?


1-1220057367
Deltas
2008-08-30 04:49
2009.10.25
Как получить текст окна класса TRichView?


15-1250873687
Student
2009-08-21 20:54
2009.10.25
WIN32.INDUC - шо за такое?





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский