![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Перехват нажатий клавиш в системе. [D7, Win2k, WinXP]
SUN_ALF © (2006-08-26 23:25:00)Доброго времени суток, господа!
Писал "ловушку" для нажатий клавиш в системе. Тестовый вариант (полностью текст библиотеки вместе с процедурой установки ловушки на листинге 1) выдавал забавный результат: на одно нажатие пробела (даже самое короткое и молниеносное :) ) выскакивали сразу два окошка МессэджБокса. Потом попробовал (листинг 2) изменить принимаемое сообщение, то есть параметр wParam, в котором хранится код нажатой клавиши. Я хотел, чтобы ловушка меняла код нажатой клавиши на код восклицательного знака (33), но результат получился нулевой: любой текстовый редактор принимал ровно тот символ, который я нажимал на клаве.
Подскажите, пожалуйста, где закопаны грабли и как их разминировать?
---------------------------------------------------
ЛИСТИНГ 1:
library KeyboardHook;
uses Windows, Messages;
var
KeyHook: HHook = 0;
handle: HWnd;
Function OnKeyHook(code: ShortInt; wParam: Word; lParam: Longint): Longint stdcall;
Begin
if code = HC_ACTION then
begin
if wParam = 32 then
begin
MessageBox(0, Pchar('space!!!'), Pchar('Принято:'), MB_OK);
end;
end;
Result:= CallNextHookEx(KeyHook, code, wParam, lParam);
End;
Procedure HookLauncher(code: Byte); export; stdcall;
Begin
if BOOL(code) then
KeyHook:= SetWindowsHookEx(WH_KEYBOARD, @OnKeyHook, HInstance, 0)
else
begin
UnhookWindowsHookEx(KeyHook);
KeyHook:= 0;
end;
End;
exports HookLauncher;
BEGIN
END.
----------------------------------------------------------
ЛИСТИНГ 2:
Function OnKeyHook(code: ShortInt; wParam: Word; lParam: Longint): Longint stdcall;
Begin
if code = HC_ACTION then
begin
if wParam = 32 then
begin
wParam:= 33;
end;
end;
Result:= CallNextHookEx(KeyHook, code, wParam, lParam);
End;
-----------------------------------------------------
Zeqfreed (2006-08-27 00:05:00) [21]> [5] SUN_ALF © (26.08.06 23:47)
> Эххх... по-русски бы, а то так я на 30% теряю суть... Видать
> потому и результат такой, какой видим.
Если значение code меньше нуля, то процедура ловушки должна передать сообщение ф-ции CallNextHookEx без дальнейшей его обработки и вернуть значение, возвращенное CallNextHookEx.
Чтобы предотвратить передачу сообщения системой другим обработчикам в цепи ловушек или целевой оконной процедуре, возвращаемое значение должно быть неравным нулю. Чтобы разрешить системе передать сообщение целевой оконной процедуре пропуская оставшиеся обработчики в цепи ловушек, возвращаемое значение должно равняться нулю.
SUN_ALF (2006-08-27 00:03:00) [22]Ketmar © (26.08.06 23:50) [6] :
Если б я еще знал, что такое MMF... =)
Ассемблер -- ладно, кой-чаво могу, хотя тоже не специалист.
"переменные должны быть у всех процессов одни и те же" -- имеется в виду у всех процессов, работающих в системе?
Ketmar (2006-08-26 23:59:00) [23]> [7] Чапаев носками хакера (26.08.06 23:54)
что однофигственно, потому что код всё равно кривой. %-)
Zeqfreed (2006-08-26 23:59:00) [24]> [7] Чапаев носками хакера (26.08.06 23:54)
> Советую запомнить, что тип WParam -- Cardinal, а не Word.
Тип wparam — WPARAM, а не Cardinal :) Хотя разница тут и не имеет никакого существенного значения.
Чапаев носками хакера (2006-08-26 23:54:00) [25]А, значит у знаменитого Флёнова пример хука тоже с Архангельского передран... Скучно, граждане. :`-(
Советую запомнить, что тип WParam -- Cardinal, а не Word.
Ketmar (2006-08-26 23:50:00) [26]> [5] SUN_ALF © (26.08.06 23:47)
если б только эта... тут сию личность уже неоднократно обсуждали. %-)
а заграничный язык надо знать. иначе очень-очень грустно программировать. %-)
намекну, что переменные должны быть у всех процессов одни и те же. тут MMF спасёт, или модуль на асме. %-)
SUN_ALF (2006-08-26 23:47:00) [27]Ketmar © (26.08.06 23:31) [1] :
=) Честно говоря, эта тематика у него хромает. Только на том, что написано в книге, у меня своего из этой области ничего не получилось. Почитал СДК, кое-чаво прошарил -- и уже хоть что-то с перехватом есть =)
Zeqfreed © (26.08.06 23:31) [2] :
Эххх... по-русски бы, а то так я на 30% теряю суть... Видать потому и результат такой, какой видим.
Чапаев носками хакера (26.08.06 23:31) [3] :
А кто такой Архангельский? =)
SUN_ALF (2006-08-26 23:34:00) [28]=))))
Оперативно же Вы... =))
приступаю к разбору написанного =)
Ketmar (2006-08-26 23:31:00) [29]> где закопаны грабли и как их разминировать?
документацию читать, а не Флёнова. %-) хуки так не пишут. %-)
и вообще -- поискать, ибо подобные темы муссировались неоднократно.
зыж за правильно заданый вопрос -- +1. за нежелание искать самому -- -1. %-)
Чапаев носками хакера (2006-08-26 23:31:00) [30]> Function OnKeyHook(code: ShortInt; wParam: Word; lParam:
> Longint): Longint stdcall;
НЕ ЧИТАЙТЕ АРХАНГЕЛЬСКОГО!
Zeqfreed (2006-08-26 23:31:00) [31]
If code is less than zero, the hook procedure must pass the message to the CallNextHookEx function without further processing and should return the value returned by CallNextHookEx.
. . .
Return Values
To prevent Windows from passing the message to the rest of the hook chain or to the target window procedure, the return value must be a nonzero value. To allow Windows to pass the message to the target window procedure, bypassing the remaining procedures in the chain, the return value must be zero.