Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Перехват оконных сообщений


-Shurik- ©   (2003-07-18 13:17:00) 

Для перехвата я заменял адрес функции обработки сообщений следующим образом:
SetWindowLong(hwnd, GWL_WNDPROC, Integer(@MyWindowProc));
Но, как оказалось, в некоторых приложениях адрес обработчика после создания окна изменяется, при этом старая процедура не вызывается, соответственно не вызывается и моя процедура MyWindowProc.
Как выйти из такой ситуации (желательно без использования хуков).


R4D][   (2003-07-19 16:35:00) [1]

Мой обработчик получает первые несколько сообщений, (до сообщения WM_CREATE)
Это как? Я всегда думал, что WM_CREATE - это первое сообщение, которое получает окно.


R4D][   (2003-07-19 13:18:00) [2]

Приведи текст WindowProc


R4D][   (2003-07-18 16:45:00) [3]

А попробуй заменять процедуру после сообщения WM_CREATE, ибо
The message is sent before the CreateWindowEx or CreateWindow function returns.
Да и правильно ли ты обробатываешь WM_CREATE, ибо
If an application processes this message, it should return 0 to continue creation of the window. If the application returns -1, the window is destroyed and the CreateWindowEx or CreateWindow function returns a NULL handle.
Не зыбывай про DefWindowProc()...


-Shurik-   (2003-07-18 14:45:00) [4]

Уточняю вопрос.
Я уствновил хук WH_CBT, отловил процесс создания окна.
При создании окна я внедрил в чужой процесс dll, и запустил в это dll процедуру, которая заменяет обработчик. Мой обработчик получает первые несколько сообщений, (до сообщения WM_CREATE), а потом все прекращается. Что делать?


R4D][   (2003-07-18 14:13:00) [5]

Что?!! Где?!! Когда?!! :)))
Ты что хочешь у ЧУЖОГО окна изменить WindowProc на подпрограмму, находящуюся в твоем адресном пространстве? А тебя Access Violation никогда не беспокоил? :)
Если серьезно, то:
1) The SetWindowLong function fails if the window specified by the hWnd parameter does not belong to the same process as the calling thread;
2) Если бы (1) и было возможно, то WindowProc должна бы была находится в адресном пространстве ЧУЖОГО процесса.
Если я тебя не правильно понял, то уточни, пожалуйста, свой вопрос.


Толик   (2003-07-18 14:09:00) [6]

вот такое работает всегда:

var
DefWndProc: longword;

function NewWndProc(const AHandle: THandle; const AMsg: longword;
const AwParam, AlParam: longint): longint; stdcall;
begin
//делаем что-то
//вызов обработчика по умолчанию
RESULT := CallWindowProc(pointer(DefWndProc), AHandle, AMsg, AwParam, AlParam);
end;

DefWndProc := SetWindowLong(Handle, GWL_WNDPROC, longint(@NewWndProc));


Наверх

Титульная страница Поиск, карта сайта Написать письмо