Вниз
Скачать: 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.02 c
3-1101115078
YurikGL
2004-11-22 12:17
2004.12.19
Выборка из процедуры.


14-1101840061
aga
2004-11-30 21:41
2004.12.19
?реклама на сайте?


9-1092186341
Xerx
2004-08-11 05:05
2004.12.19
Как работает OpenGL


3-1100872886
Wolffgang
2004-11-19 17:01
2004.12.19
fkCalculated = -1, потом 2


14-1101474549
dr Tr0jan
2004-11-26 16:09
2004.12.19
Загрузка компьютера по таймеру




   Наверх