Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Потрепаться";
Текущий архив: 2002.04.08;
Скачать: [xml.tar.bz2];

Вниз

вопрос знатокам хуков(Юрию Зотову, Fellomene, Ивану Шихалеву и всем всем   Найти похожие ветки 

 
alexey1   (2002-02-22 02:27) [0]

Как перехватить событие WM_COMMAND в чужом окне,
я знаю что это делается с помощью функции setwindowshookex, процедуры callwndproc и структуры
CWPSTRUCT. Но не могу понять, как всё это соединить вместе, так что бы всё заработало,
ещё нужножно зачем-то вызывать функцию CallNextHookEx, короче говоря в голове каша.
Хотя я видел хук на мышь, и то работающий только в win9x.

Вот к примеру вырезал из какого-то компонента хук и попытался применить к перехвату wm_command
в другом окне, вот отрывок кода:

// типа обработка оконной процедуры, перехватывает нажатие на лыбую кнопку( в данном случае класса
TButton, вообще-то класс кнопки неважен )
function MyCallWndProcHook(Code: Integer; wParam: word; lParam: LongInt): Longint; stdcall;
var
CallWndProcInfo: TCWPStruct;
hWnd: THandle;
szClassName: array[0..255] of char;
begin
if code < 0 then
begin
Result := CallNextHookEx(HOOKHANDLE, Code, wParam, lParam);
exit;
end;
Result := 0;
CallWndProcInfo := TCWPStruct(Pointer(lParam)^);
if (CallWndProcInfo.message = WM_COMMAND) then
begin
showmessage("nagata button");
end;
end;

//типа указание типа хука
function SetHook: LongBool; stdcall;
begin
HookHandle := SetWindowsHookEx(WH_CALLWNDPROC, @MyCallWndProcHook,HINSTANCE,getcurrentthreadid);
Result := HookHandle <> 0 ;
end;

//снятие хука
function RemoveHook: LongBool; stdcall;
begin
Result := UnHookWindowsHookEx(HookHandle)
end;


//установка хука
procedure TForm1.FormCreate(Sender: TObject);
begin Form1.Caption:="MouseHook"; SetHook; end;

procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
begin
RemoveHook;
end;


И вот весь этот бред, который я написал выше, представляете, даже работает, но только для окна моей программы
и параметр getcurrentthreadid в setwindowshookex говорит об этом,
то есть хук получается только для моего окна(наверное).
Елсли за место getcurrentthreadid в setwindowshookex поставить 0, то как бы хук получается глобальным
что ли и при нажатии на какую-нибудь кнопку (неважно какого класса будь это класс button или
Tbutton) выдаются различные ошибки, заканчивающиеся зависанием.

Уважаемые знатоки помогите разобратся. Хотелось бы услышать Юрия Зотова или fellomenu, а
также тех, кто в этом понимает.
Может кто-нибудь примерчик рабочий пришлёт по теме или адрес в интернете по глобальным хукам.

Мой e-mail: stainer@mail.ru
Всем огромное спасибо.


 
alexey1   (2002-02-22 08:02) [1]

Кто - нибудь, отзовитесь.


 
Alx2   (2002-02-22 08:28) [2]

MyCallWndProcHook в DLL?
sharemem в uses есть?


 
Виктор Щербаков   (2002-02-22 09:08) [3]

http://delphi.mastak.ru/cgi-bin/faq.pl?look=1&id=988619882&n=15


 
Виктор Щербаков   (2002-02-22 09:12) [4]

Десятки раз уже говорилось:
глобальный хук должен быть в dll


 
Dimaond Cat   (2002-02-25 00:50) [5]

Теория если объяснять на пальцах, то все выглядит примерно так,
Глобальный хук обязан быть в длл, (это связанно с адресными пространствами которые распределяют сами винды)
функция SetWindowsHookEx устанавливает свой "просмоторщик" определенных тобою событий, при срабатывании этой функции в цепочку других (не твоих) "просмоторщиков" пристраиваится твой.
ему отводится собственный адрес по которому происходит общение с ним, этот адрес передается тебе в виде result-а от SetWindowsHookEx, в SetWindowsHookEx ты должен описать функцию, которая будет отвечать за обработку интересующего тебя события,
в этой функции обязан присутствовать вызов CallnexthookEx который передаст управление следующему хуку в цепочке хуков.
Более серьезно объяснять как и почему так, а не эдак, не имеет смысла , слишком обширная тема. Лучше купи литературу.


 
Raptor   (2002-02-25 11:18) [6]

ему отводится собственный адрес по которому происходит общение с ним, этот адрес передается тебе в виде result-а от SetWindowsHookEx

Здесь немного неправильно. SetWindowsHookEx возвращает не адрес твоего хука, а дискриптор следующего, после твоего, хука в цепочке. И при вызове CallNextHookEx передается управление тому хуку, чей дискриптор был передан этой функции (первый праметр).
Соответственно, если передать функции CallNextHookEx дискриптор, полученый от функции SetWindowsHookEx при установке хука, будет вызван следующий, после твоего, хук в цепочке.



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

Форум: "Потрепаться";
Текущий архив: 2002.04.08;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.47 MB
Время: 0.005 c
1-22718
Yuri_V
2002-03-26 11:00
2002.04.08
Как передать в процедуру имя формы?


1-22621
Dimedrol
2002-03-27 17:37
2002.04.08
TreeView - каждый TNode со своим хинтом...


3-22534
Incha
2002-03-14 15:12
2002.04.08
Срочно нужна помощь.


1-22618
VictorT
2002-03-27 16:29
2002.04.08
Список файлов в конкретной папке (без вложеных)


1-22669
yar
2002-03-28 13:21
2002.04.08
Печать из TImage





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский