Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2004.02.25;
Скачать: CL | DM;

Вниз

Ставлю глобальный хук на клавиатуру, но клавиши не ловятся.   Найти похожие ветки 

 
Amadeus   (2003-12-19 00:08) [0]

Ставлю глобальный хук на клавиатуру. Когда нажимаю кнопки в своём приложении, то всё нормально. Но когда кнопки нажимаются в другом приложении, то эти нажатия не регистрируются.
Вот исходники Dll и exe-шника:

Код Dll
---------------------------
Library HookDLL;

Uses
Windows, Messages, SysUtils;

Const WM_MES=WM_USER+10000;

Var
HookHandle:THandle;
ProgHandle:THandle;

Function KeyboardHook(Code: Integer; ParamW: WPARAM; ParamL: LPARAM): LRESULT;stdcall;
Begin
If Code<0 Then
Begin
Result := CallNextHookEx(HookHandle, Code, ParamW, ParamL);
Exit;
End;
SendMessage(ProgHandle, WM_MES, ParamW, Code);
Result := CallNextHookEx(HookHandle, Code, ParamW, ParamL);
End;

Function SetKeyboardHook(Wnd: HWND): BOOL; stdcall;
Begin
ProgHandle:=Wnd;
HookHandle:=SetWindowsHookEx(WH_KEYBOARD, @KeyboardHook, HInstance, 0);
End;

Function RemoveKeyboardHook: BOOL; stdcall;
Begin
Result:=UnhookWindowsHookEx(HookHandle);
End;

Exports
SetKeyboardHook, RemoveKeyboardHook;

BEGIN

END.

--------------------------------
Код exe-шника
--------------------------------
unit Main;
const WM_MES=WM_USER+10000;
...
Procedure WMMes(Var Message: TMessage); Message WM_MES;
...
Function SetKeyboardHook(Wnd: HWND): BOOL; stdcall; external "HookDLL.dll" name "SetKeyboardHook";
Function RemoveKeyboardHook: BOOL; stdcall; external "HookDLL.dll" name "RemoveKeyboardHook";
...
Procedure TForm1.WMMes(var Message: TMessage);
var element:string;
Begin
element:=GetElement(Message); // эта функция у меня получает символ, который потом записывается в Memo
Memo1.Lines.Add(element);
End;

procedure TForm1.Button5Click(Sender: TObject);
begin
SetKeyboardHook(Handle);
end;

procedure TForm1.Button13Click(Sender: TObject);
begin
RemoveKeyboardHook;
end;

------------------------------------

Интересно, что функция SendMessage(ProgHandle, WM_MES, ParamW, Code); вроде как выполняется, но вызова
Procedure TForm1.WMMes(var Message: TMessage); почему то не происходит!

И ещё странно, когда в Far"e нажимаю кнопки, то тоже всё нормально перехватывается (как и в самом моём приложении), в других же программах нет.


 
Digitman ©   (2003-12-19 09:33) [1]


> в других же программах нет


если под "другими программами" подразумеваются консольные приложения, ДОС-задачи и NT-службы, то так и должно быть


 
Amadeus   (2003-12-19 13:02) [2]

>если под "другими программами" подразумеваются консольные >приложения, ДОС-задачи и NT-службы, то так и должно быть

Нет, самые обычные win32 приложения: проводник, word, internet explorer, блокнот и т.д.


 
Digitman ©   (2003-12-19 14:31) [3]

у тебя есть серьезная ошибка : переменная ProgHandle во всех создаваемых экз-рах HookDLL (кроме самого первого) равна нулю.

Эту переменную нужно делать глобально-уникальной

См. примеры в статьях на этом сайте в части CreateFileMapping() и MapViewOfFile()


 
Amadeus   (2003-12-20 03:05) [4]

Спасибо, всё сделал, всё работает.
Только что я обнаружил. Когда компилирую этот код (или примеры с этого сайта) на Delphi 7, то в процессе работы постоянно выдаётся какая то ошибка памяти. В Delphi 5 всё нормально. Кто-нибудь с этим сталкивался?


 
Digitman ©   (2003-12-20 11:31) [5]


> постоянно выдаётся какая то ошибка памяти


а голова и отладчик для чего существуют по-твоему ?)



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

Текущий архив: 2004.02.25;
Скачать: CL | DM;

Наверх




Память: 0.48 MB
Время: 0.023 c
14-80214
zSerg
2004-01-30 14:29
2004.02.25
Построение минимального прямоугольниа


14-80218
Nikolay M.
2004-02-05 17:43
2004.02.25
ОФИСНАЯ МОЛИТВА... :)


14-80264
J_S
2004-02-03 11:52
2004.02.25
MS XML v.2.0 & DTD


14-80148
SergP
2004-02-02 05:21
2004.02.25
MySQL. Не работает запрос. Что можно сделать?


7-80332
Cosinus
2003-12-02 13:37
2004.02.25
Странное влияние монитора портов на обмен данными