Вниз
Скачать: 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-1099581539
olookin
2004-11-04 18:18
2004.12.19
Прогнозы на 5-й тур Лиги Чемпионов


1-1101993861
tytus
2004-12-02 16:24
2004.12.19
Совместное использование .


3-1100766672
TAN_K
2004-11-18 11:31
2004.12.19
Заполнение данных формы из справочника


8-1096127059
maxXP
2004-09-25 19:44
2004.12.19
Изменение размера видео при воспроизведении


14-1101976195
Knight
2004-12-02 11:29
2004.12.19
Есть простой редактор DOS-текстов?




   Наверх