Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "WinAPI";
Текущий архив: 2003.09.11;
Скачать: [xml.tar.bz2];

Вниз

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

 
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 вся ветка

Форум: "WinAPI";
Текущий архив: 2003.09.11;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.46 MB
Время: 0.008 c
14-33753
Пробегал
2003-08-21 22:22
2003.09.11
Зачем вы баните прокси?


14-33759
ИгорьМГ
2003-08-23 13:57
2003.09.11
Вопрос по доступу к базе данных на сервере


3-33520
undersun
2003-08-19 15:38
2003.09.11
Установка Firebird под Linux


9-33420
Анат
2002-10-09 23:19
2003.09.11
Звук


1-33634
lord
2003-08-30 22:36
2003.09.11
а что рекурсия в потоке не работает ?





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский