Оба хука на перехват нажатия клавиш. DLL использую впервые.
1. Хук глобальный.
Делаю так.
DLL:
- Код: Выделить всё
function KeyBoardHook(code:integer; wparam:wparam; lparam:lparam):Lresult; stdcall; export;
begin
beep(2000,15);
result:=CallNextHookEx(HINSTANCE,code,wParam,lparam);
end;
В исполняемом:
- Код: Выделить всё
descDLL:=LoadLibrary('keyboardhook.dll');
descFunc:=HOOKPROC(GetProcAddress(descDLL, 'KeyBoardHook'));
descHook:=SetWindowsHookEx(WH_KEYBOARD, descFunc, descDLL,0);
s:='1';
while s<>'0' do begin
readln(s);
end;
UnhookWindowsHookEx(descHook);
И тут, как не странно, всё заработало. Бикает при нажатии клавиш в любом месте. Правда бикает как-то чрезмерно долго...но бикает же!=)
Вопросы:
1. Почему для глобального процедура обработки обязана быть в dll?
2. Как в dll получить дескриптор текущей хуки для передачи в CallNextHookEx? HINSTANCE совершенно точно не то. Если не ошибаюсь - то есть дескриптор текущего модуля, а функция требует именно хуку..
3. Возможно, вопрос еще тупей первого, но всё же.. Как, например, посчитать кол-во сработанных ловушек, если параметры функции-обработки статичны и вызывается она из библиотеки?
2. Хук локальный.
- Код: Выделить всё
function KeyBoardHook(code:integer; wparam:wparam; lparam:lparam):Lresult; stdcall;
begin
Windows.Beep(100,100);
writeln('YES');
result:=CallNextHookEx(descHook,code,wParam,lparam);
end;
begin
descHook:=SetWindowsHookEx(WH_KEYBOARD, @KeyBoardHook, 0,GetCurrentThreadID());
s:='1';
while s<>'0' do begin
readln(s);
end;
UnhookWindowsHookEx(descHook);
end.
Казалось, что оно должно быть проще, но...скомпилировалось а не заработало. При этом функция установки возвращает значение, отличное от нуля, следовательно хук вроде как поставился.
Вопрос пока только один:
Почему не работает? Вообще никакой реакции при вводе в приложении. Никакого тебе бипа...ничего Пробовал хук мыши - тоже самое: ноль реакций, фон презрения...
Добавлено спустя 15 часов 14 минут 44 секунды:
Плюс вопрос к глобальным.
Отчего-то срабатывают ловушки на клавиши лишь у открытых до старта хука программ. Если открыть новую и там хоть что-то вжать - все виснет:(
Добавлено спустя 1 час 32 минуты 25 секунд:
А нет. Это просто в некоторых, преимущественно системных, приложениях хук вызывает вылет..