Вниз
Скачать: 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.014 c
1-71611
ShtuKos
2003-09-09 12:37
2003.09.22
Как сделать, чтоб прогу нельзя было копировать на другие компьюте


1-71741
Алексей Петухов
2003-09-10 13:03
2003.09.22
WordApplication


4-71998
Pi314
2003-07-20 20:54
2003.09.22
HOOK мыши - KeyState?


14-71911
jack128
2003-09-03 10:10
2003.09.22
Именинники 3 сентября


1-71737
bon
2003-09-10 14:07
2003.09.22
вопрос




   Наверх