Форум: "Основная";
Текущий архив: 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