Главная страница
    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.45 MB
Время: 0.016 c
1-71664
kostya-nsk
2003-09-08 18:07
2003.09.22
I/O error 32


3-71544
Def
2003-09-02 11:46
2003.09.22
CommitRetaining отправляет в базу не все обновления


14-71838
Igor__
2003-09-01 17:52
2003.09.22
Иконки с использованием прозрачности


3-71493
yurez
2003-09-01 15:43
2003.09.22
translate error. value out of bounds - не могу забороть.


4-71995
__Ed__
2003-07-17 19:33
2003.09.22
Как отловить момент создания нового окна?





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский