Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2003.09.22;
Скачать: 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 вся ветка

Текущий архив: 2003.09.22;
Скачать: CL | DM;

Наверх




Память: 0.48 MB
Время: 0.042 c
6-71799
Z_man7777
2003-07-21 14:46
2003.09.22
Локальный чат


14-71941
Ketmar
2003-09-02 14:56
2003.09.22
сервисы ntvdm -- документация. где?


1-71722
Николай
2003-09-10 15:33
2003.09.22
события колесика


14-71864
MacroDenS
2003-09-01 11:21
2003.09.22
Всех с с праздником!


7-71970
bloodman
2003-07-08 21:23
2003.09.22
HOOk & DLL