Вниз
Скачать: 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
3-1100857001
Fishka
2004-11-19 12:36
2004.12.19
Поле типа Memo - при больших объемах ошибка!


3-1100598738
Explorer
2004-11-16 12:52
2004.12.19
DBGridEh - выделение ячейки


4-1099393875
Леонид
2004-11-02 14:11
2004.12.19
Перехват сообщения другого приложения


14-1101850656
Cheater
2004-12-01 00:37
2004.12.19
Отличие 2 кандидатов


1-1102410677
KOSH
2004-12-07 12:11
2004.12.19
bufer




   Наверх