Форум: "Потрепаться";
Текущий архив: 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