Вниз
Скачать: CL | DM;

Отключение ловушки   Найти похожие ветки 

← →
Destroyer2   (2004-12-07 14:14) [0]

Добрый день. В своей программе мне надо было реализовать ловушку (hook) на нажатие кнопок клавы (в любом процессе). Я нашел код для dll, который должен реализовать эту ловушку. Ловушка работает отлично, но, после отлова хотя бы одного сообщения от клавы, если выйти из моей проги, то удалить dll нельзя ("Используется Windows"). Помогите разабраться плиз, почему ловушка не отключается. Вот код dll:
library KBHook;
uses
 SysUtils,  Classes,  Windows,  Messages;
const
 WM_CATCHHOOK=WM_USER+$FF;
 HookHandle:hHook=0;
var
 SaveExitProc:Pointer;
 H:Hwnd;
 {собственно ловушка}
function Key_Hook(Code:Integer;wParam:Word;lParam:Longint):Longint; stdcall; export;
begin
 if (Code>=0) then
   begin
     SendMessage(H,WM_CATCHHOOK,0,0);
     Result:=0;
   end
 else
   Result:=CallNextHookEx(HookHandle,Code,wParam,lParam);
end;

procedure LocalExitProc; far;
begin
 if HookHandle<>0 then
   UnhookWindowsHookEx(HookHandle);
 ExitProc:=SaveExitProc;
end;

exports Key_Hook;
begin
 H:=FindWindow("TMainForm", "Header");
 HookHandle:=SetWindowsHookEx(WH_Keyboard,@Key_Hook,hInstance,0);
 if (HookHandle=0) then
   MessageBox(0,"Unable to set hook!","Error",mb_Ok)
 else
   begin
     SaveExitProc:=ExitProc;
     ExitProc:=@LocalExitProc;
   end;
end.


← →
Leonid Troyanovsky   (2004-12-07 14:36) [1]


> Добрый день. В своей программе мне надо было реализовать
> ловушку (hook) на нажатие кнопок клавы (в любом процессе).
> Я нашел код для dll, который должен реализовать эту ловушку.
> Ловушка работает отлично, но, после отлова хотя бы одного
> сообщения от клавы, если выйти из моей проги, то удалить
> dll нельзя ("Используется Windows"). Помогите разабраться
> плиз, почему ловушка не отключается. Вот код dll:

> exports Key_Hook;
> begin
>  H:=FindWindow("TMainForm", "Header");
>  HookHandle:=SetWindowsHookEx(WH_Keyboard,@Key_Hook,hInstance,0);
>  if (HookHandle=0) then
>    MessageBox(0,"Unable to set hook!","Error",mb_Ok)
>  else
>    begin
>      SaveExitProc:=ExitProc;
>      ExitProc:=@LocalExitProc;
>    end;
> end.


Оный код выполняется при каждой загрузке библиотеки,
т.е., немеренно. Т.к. выполняет его загружающий поток,
то и освободить ее никак нельзя.
Т.е., экспортировать надо не key_hook, а SetKeyHook.
Кроме того, надо обеспечить доступность значения HookHandle
в других экземплярах dll, работающих в чужих процессах
(см. CreateFileMapping etc.)

Короче говоря, пример ты выбрал плохой (а их как грязи).

--
С уважением, LVT.



Страницы: 1 вся ветка

Скачать: CL | DM;



Память: 0.45 MB
Время: 0.023 c
14-1101782768
Думкин
2004-11-30 05:46
2004.12.19
С днем рождения! 30 ноября


3-1100885936
Fin
2004-11-19 20:38
2004.12.19
MS Sql server под XP


3-1100789541
serg9
2004-11-18 17:52
2004.12.19
Редактировать DBGrid подключен к интербазе через квери.


1-1102260513
alexa
2004-12-05 18:28
2004.12.19
Картинки в TreeView


14-1101796819
uny
2004-11-30 09:40
2004.12.19
человеческий фактор или свобода?




   Наверх