Форум: "WinAPI";
Текущий архив: 2004.02.25;
Скачать: [xml.tar.bz2];
ВнизСтавлю глобальный хук на клавиатуру, но клавиши не ловятся. Найти похожие ветки
← →
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 вся ветка
Форум: "WinAPI";
Текущий архив: 2004.02.25;
Скачать: [xml.tar.bz2];
Память: 0.45 MB
Время: 0.042 c