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

Вниз

Пишу хук для глобального слежения за нажатыми клавищами...   Найти похожие ветки 

 
m_a_r_t ©   (2003-07-13 00:07) [0]

Не могу понять в чем ошибка, в коде DLL с ловушкой ошибок, как бы и нет.
Но когда хук запущен, и в каком нибудь приложении нажата клавиша то выскакивает такое
сообщение об ошибке:
Программа NOTEPAD вызвала сбой при обращении к странице памяти
в модуле <нет данных> по адресу 00de:00000013.

После чего NOTEPAD или любое другое приложетие фатально завершается.
А самое странное если клавиша была нажата в приложении откуда был вызван
хук то всё работает нормально...

Если хук снять то никаких подобных ошибок не возникает.
Привожу код DLL:


{
KeyHook
author: M_A_R_T
e-mail: m_a_r_t@mail.ru
}

library keyhook;

uses
Windows;

type
TEventProc = procedure;

PInfoKey = ^TInfoKey;
TInfoKey = packed record
AppWnd: HWND;
key: LongInt;
end;

var
SysHook:HHook;
OnKeyDown: TEventProc;
OnKeyUp: TEventProc;
InfoKey: PInfoKey;

function KeyboardProc(code : integer; wParam : word; lParam : longint) : longint; stdcall;
begin

if code < 0 then
begin
Result:= CallNextHookEx(SysHook, Code, wParam, lParam);
Exit;
end;

{ если это условие не выролняется то ошибок не возникает}
if code = HC_ACTION then
begin
InfoKey^.AppWnd:= GetForegroundWindow();
InfoKey^.key:=wParam;

if ((lParam and 30)=30) then // с помощью этого я пытался узнать
OnKeyUp // была клавиша была нажата или отпущена
else // данное условие не работает
OnKeyDown; // что написать, что это узнать
end;
CallNextHookEx(SysHook, Code, wParam, lParam);
Result:= 0;
end;

procedure hook(switch : Boolean;InfKey: PInfoKey; KeyDownProc,KeyUpProc: TEventProc) export; stdcall;
begin
if switch=true then
begin
SysHook := SetWindowsHookEx(WH_KEYBOARD, @KeyboardProc, HInstance, 0);
OnKeyDown:=KeyDownProc;
OnKeyUp:=KeyUpProc;
InfoKey:=InfKey;
end
else
begin
( SysHook)
Не могу понять в чем ошибка, в коде DLL с ловушкой ошибок, как бы и нет.
Но когда хук запущен, и в каком нибудь приложении нажата клавиша то выскакивает такое
сообщение об ошибке:
Программа NOTEPAD вызвала сбой при обращении к странице памяти
в модуле <нет данных> по адресу 00de:00000013.

После чего NOTEPAD или любое другое приложетие фатально завершается.
А самое странное если клавиша была нажата в приложении откуда был вызван
хук то всё работает нормально...

Если хук снять то никаких подобных ошибок не возникает.
Привожу код DLL:


{
KeyHook
author: M_A_R_T
e-mail: m_a_r_t@mail.ru
}

library keyhook;

uses
Windows;

type
TEventProc = procedure;

PInfoKey = ^TInfoKey;
TInfoKey = packed record
AppWnd: HWND;
key: LongInt;
end;

var
SysHook:HHook;
OnKeyDown: TEventProc;
OnKeyUp: TEventProc;
InfoKey: PInfoKey;

function KeyboardProc(code : integer; wParam : word; lParam : longint) : longint; stdcall;
begin

if code < 0 then
begin
Result:= CallNextHookEx(SysHook, Code, wParam, lParam);
Exit;
end;

{ если это условие не выролняется то ошибок не возникает}
if code = HC_ACTION then
begin
InfoKey^.AppWnd:= GetForegroundWindow();
InfoKey^.key:=wParam;

if ((lParam and 30)=30) then // с помощью этого я пытался узнать
OnKeyUp // была клавиша была нажата или отпущена
else // данное условие не работает
OnKeyDown; // что написать, что это узнать
end;
CallNextHookEx(SysHook, Code, wParam, lParam);
Result:= 0;
end;

procedure hook(switch : Boolean;InfKey: PInfoKey; KeyDownProc,KeyUpProc: TEventProc) export; stdcall;
begin
if switch=true then
begin
SysHook := SetWindowsHookEx(WH_KEYBOARD, @KeyboardProc, HInstance, 0);
OnKeyDown:=KeyDownProc;
OnKeyUp:=KeyUpProc;
InfoKey:=InfKey;
end
else
begin
UnhookWindowsHookEx(SysHook);
end;
end;

exports hook;

end.


Прошу не издеватся над моим вопросом, а ответить на него.


 
Spawn ©   (2003-07-13 06:24) [1]

Ты в hook передаешь процедуры для KeyDownProc и KeyUpProc? Передаешь их из своего приложения, поетому у тебя, помоему, и ошибка, т.к. эти процедуры находятся в адресном пространстве вызывающего приложения и не могут быть доступны в твоей ДЛЛ.


 
Song ©   (2003-07-13 17:35) [2]

В Result надо отдавать CallNextHookEx


 
m_a_r_t ©   (2003-07-14 03:23) [3]

Всем спасибо, тпереь я использу Sendmessage, место вызова процедур, и заношу CallNextHookEx в Result,
теперь всё работает...
Но меня заинересовало одно:
Как тошда вызывается WindowProc, если
ее адре который мы передали при создании окна,
находится не в адресном пространстве ДЛЛ которая
вызывает эту процедуру, или там всё не так?



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

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

Наверх




Память: 0.48 MB
Время: 0.027 c
14-33744
Pindos
2003-08-24 06:26
2003.09.11
г.Оренбург, здесь нас 14 чел.!!!


6-33712
Skywalker
2003-07-08 16:11
2003.09.11
Как работает веб-сервер?


3-33457
P0tia
2003-08-20 22:27
2003.09.11
Label и ComboBoxEx


1-33669
Михаил. Т
2003-08-29 16:16
2003.09.11
TAction


14-33755
Экселенц
2003-08-24 07:26
2003.09.11
бесплатный helpmaker