Вниз
Скачать: CL | DM;

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

 
-Shurik-   (2003-07-18 13:17) [0]

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


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

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

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));


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

Что?!! Где?!! Когда?!! :)))
Ты что хочешь у ЧУЖОГО окна изменить 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 должна бы была находится в адресном пространстве ЧУЖОГО процесса.
Если я тебя не правильно понял, то уточни, пожалуйста, свой вопрос.


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

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


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

А попробуй заменять процедуру после сообщения 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()...


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

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


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

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



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

Скачать: CL | DM;



Память: 0.46 MB
Время: 0.023 c
3-71552
ddenis
2003-08-29 13:55
2003.09.22
Многопоточное приложение для работы с БД


3-71465
Debugger
2003-08-29 08:46
2003.09.22
Как округлить значение в DBGrid?


6-71794
Dwemer
2003-07-22 00:31
2003.09.22
Как поймать момент подключения к инету?


1-71743
-AGGRESSOR-
2003-09-10 13:03
2003.09.22
OLE и потоки


14-71878
Пубертанец
2003-09-04 11:33
2003.09.22
Есть ли польза от очков для компьютеров?




   Наверх