Текущий архив: 2004.01.26;
Скачать: CL | DM;
Вниз
SetWindowsHookEx(WH_KEYBOARD, 0) Найти похожие ветки
← →
KADAN (2003-11-17 22:14) [0]Доброго времени суток, мастера!
Возникла некоторая проблемка...не могу поставить хук на 0 (на WH_KEYBOARD).
Делаю так: есть DLL-ка, в ней ставится хук, процедура
обработки там же (с резултом CallNextHookEx). среди переменных DLL-ки только
HHOOK и процедурка приложения, в которую отдаются хукнутые данные.
Пока я в своем приложении хук работает, как только нажму эникей на
рабочем столе хук падает, только хендл остается :)
(Хотя в фаре хук работает, как ни странно).
← →
Shluz © (2003-11-18 01:15) [1]ошибка в процедуре ловушки, скорее всего использовал RTL функции и вроде того... лучше конечно код выложи
← →
Digitman © (2003-11-18 08:31) [2]первый параметр ф-ции CallNextHookEx() у тебя указывает в "никуда", вот и "падает" тот процесс, который вызвал эту ф-цию
← →
KADAN (2003-11-18 10:41) [3]Ну ладно, вот DLLина.
library Project2;
uses
windows, sysutils;
type TObrabotkaProc = procedure(wparam, lparam: Cardinal);
var H:HHOOK;
ObrProc:TObrabotkaProc;
function Hooking(code: Integer; wparam: WPARAM; lparam: LPARAM): LRESULT stdcall;
begin
ObrProc(wparam,lparam);
result:=CallNextHookEx(H,code,wparam,lparam);
end;
function HOOKKB(Hmod:HINST;ThreadID:Cardinal; const Obrabotka:TObrabotkaProc):boolean;
begin
if H<>0 then messageboxex(0,"Already hooked!","Error",MB_ICONERROR or MB_OK or MB_APPLMODAL,0)
else begin
H:=SetWindowsHookEx(WH_KEYBOARD,@hooking,Hmod,ThreadID);
ObrProc:=Obrabotka;
if H=0 then messageboxex(0,"Can""t set hook!","Error",MB_ICONERROR or MB_OK or MB_APPLMODAL,0);
end;
result:=H<>0;
end;
function UNHOOKKB:boolean;
begin
result:=UnhookWindowsHookEx(H);
H := 0;
end;
exports HOOKKB, UNHOOKKB;
begin
end.
← →
Digitman © (2003-11-18 10:46) [4]
> var H:HHOOK
!!!!!!!!!!
вот как ты думаешь, СКОЛЬКО таких "переменных" существует в системе после установки глоб.хука ?
← →
KADAN (2003-11-18 11:16) [5]ну тогда покажи как
← →
Digitman © (2003-11-18 11:22) [6]а статьи соотв-щие почитать на этом сайте для начала ? лень ?
← →
KADAN (2003-11-18 23:09) [7]>2 Digitman
у меня сложилось впечатление, что все твои ответы сводятся к "читай мануал"... читал, да... очень интересное чтиво... но не помогло :(
← →
Игорь Шевченко © (2003-11-19 00:01) [8]KADAN (18.11.03 23:09)
В статьях этот момент очень подробно описан, про то, как и где надо хранить общие для глобального хука переменные, а именно в проекции файла в память.
Два раза попробуй прочитать.
← →
Digitman © (2003-11-19 11:03) [9]
> KADAN
мне хочется чтобы ты думал) ... понимаешь ? ду-мал ! сам думал ! а не чужой головой) ... толку от этого, поверь, как от козла молока
посему в [4] я задал тебе важный наводящий вопрос, который ты попросту проигнорировал ... проигнорировал ты, видимо, и рекомендацию сравнить пример в статье со своим кодом ... чего ж еще-то хочешь после этого ?
← →
jonni © (2003-11-19 20:11) [10]http://www.gajits.com/delphihooks.asp
tut vse est"
← →
Digitman © (2003-11-20 11:37) [11]
> jonni
все это замечательно, но есть ряд оч важных моментов, не учитываемых и никак не комментируемых там.
1) этот код, будучи использованный не обычным приложением, а NT-сервисом, работать как положено не будет - возникнут серьезные проблемы с CreateFileMapping() с указанными в примере правами доступа к глоб.памяти
2) нет никакой гарантии, что SetWindowsHookEx() вернет хэндл хука в глоб.доступную переменную rHookRec^.HookID РАНЬШЕ чем он будет использован первым же вызовом ф-ции CallNextHookEx().. Результат такой ситуации - непредсказуемый. Следовательно, без глоб.объекта синхронизации доступа к переменной rHookRec^.HookID не обойтись, ибо MSDN никак не комментирует возможность или невозможность такой ситуации.
← →
jonni © (2003-11-20 16:07) [12]to Digitman ©
1) kto skazal pro kakoy to servicie??? v chem problema FileMapping dlya NT servica???
2) kak ti sebe predstavlyash situaciyu kogda hook esche ne ustanovlen a uzhe vizivaetsya funkciya hooka gde u tebya CallNextHookEx... absurd :(
vkonce koncov esli eto tak strashno to togda proveryai znachenie svoego HHOOK chtobi podstrahovat"sya... no niukogo takoy problemi nikogda ne voznikalo....
vsegda esli hook stavilsya to HHOOK bila pravil"naya i CallNextHook vsegda rabotal otlichno
nado esche ne zabivat" pri obrabotke v @hooking Code>=0
← →
Digitman © (2003-11-20 16:48) [13]
> 1) kto skazal pro kakoy to servicie??? v chem problema FileMapping
> dlya NT servica???
я сказал) ... ибо столкнулся с такой ситуацией "в лоб" ... разбираться, правду скажу, не стал - не было времени, решил проблему организации глоб.доступных данных иным образом, без использования MMF ... но суть там была такова : сервис грузил экз-р хук-DLL, в ходе иниц-ции экз-ра успешно вызывалась CreateFileMapping(PAGE_READWRITE), далее устанавливался сам хук, после чего хук-DLL в ходе автовнедрения системой очер.своего экз-ра пыталась проделать тоже самое CreateFileMapping(PAGE_READWRITE), и код иниц-ции экземпляра получал отлуп из-за невозможности получить доступ к MMF ИМЕННО с правами PAGE_READWRITE (успешен был запрос только на PAGE_READ)
и это - факт невозможности перенести код примера работы с MMF "один-в-один" в приложение-сервис, по кр.мере для Win2000
> kak ti sebe predstavlyash situaciyu kogda hook esche ne
> ustanovlen a uzhe vizivaetsya funkciya hooka gde u tebya
> CallNextHookEx... absurd :(
почему "абсурд" ?
смотри сюда)
Предположим, процесс, устанавливающий глоб.хук, имеет пониженный приоритет
Некий код.поток этого процесса вызвал ф-цию
GlobalData^.hHookHandle := SetWindowsHookEx(), (1)
в теле которой (!!) система УЖЕ начинает разворачивать послед-ть действий по внедрению и инициализации экз-ров хук-DLL в существующие GUI-процессы (это происходит в основных кодовых потоках уже тех процессов, в которые очер.экз-р внедряется, и целевые процессы могут иметь значительно более высоций приоритет, нежели процесс, устанавливающий хук).
В какой-то момент времени может случиться так, что очередной внедренный экз-р завершил инициализацию и тут же возможен вызов системой колбек-ф-ции, где тут же вызывается CallNextHookEx(GlobalData^.hHookHandle, ...)
Но !
см.(1) - значение хендла хука будет записано в область памяти GlobalData^.hHookHandle ПОСЛЕ всего этого ! Значит, те процессы, в которые уже внедрена хук-DLL (и иниц-я ее успешно завершилась) имеют все шансы на вызвов системой колбэк-ф-ции, и , соответственно, на обращение к GlobalData^.hHookHandle, значение которой ЕЩЕ НЕ УСТАНОВЛЕНО !
Страницы: 1 вся ветка
Текущий архив: 2004.01.26;
Скачать: CL | DM;
Память: 0.51 MB
Время: 0.008 c