Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Перехват нажатий клавиш в системе. [D7, Win2k, WinXP]


Страницы:   1 2

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.


Страницы:   1 2

Наверх

Титульная страница Поиск, карта сайта Написать письмо