Ловушка сообшений

  • Автор темы Proger
  • Дата начала
Статус
Закрыто для дальнейших ответов.
P

Proger

Гость
#1
Уважаемые системные прграммисты, простите за(возможно) ламерский вопрос.
Я хочу перехватывать все клавиши для всех приложений и для этого ставлю ловушку сообшиний:
///////////////////////////////////////////////////////

////////////////////////////////
function Key_Hook(code : integer; wParam: Integer;

lParam : Integer): Integer; stdcall;
begin
if (code <> HC_ACTION)then
begin
Append(ScnFile);
WriteLn(ScnFile, '<KeyPresed>');
Writeln(ScnFile, ' ', wParam);
WriteLn(ScnFile, '<KeyPresed/>');
CloseFile(ScnFile);

end;

CallNextHookEx(HKey, Code, wParam, lParam);
end;

function StartHookKey(Path : String) : hHook;
begin
// Инициализация файловой переменной
AssignFile(ScnFile, Path);
// Установка ловушки
HKey := SetWindowsHookEx(WH_KEYBOARD, @Key_Hook,

hInstance, 0);
Result := HKey;
if Result = 0 then // Ловушка не установилась
ShowMessage('Ошибка');

end;

procedure RemoveHookKey(var h : hHook);
begin
if h <> 0 then
begin
UnhookWindowsHookEx(h);
h := 0;
end;
end;

Вызов процедур из основного модуля:
/////////////////////////////////////////////////////////
procedure TForm1.MRecExecute(Sender: TObject);
begin
Rewrite(ScnFile);
CloseFile(ScnFile);
HookKey := StartHookKey(ScnPath);
end;


procedure TForm1.MStopExecute(Sender: TObject);
begin
RemoveHookKey(HookKey);
end;

Ловушка должна перехватывать нажатие всех клавиш и записывать в файл коды нажатых клавиш.
Но проблема в том что callback функция даже не вызывается!!!!!

Помогите пожалуста.

Заранее благодарен.
 
Z

zubr

Гость
#2
Глобальный хук должен быть в отдельной dll.
 
Z

zubr

Гость
#4
Для: Proger
1. Как ты определил, что callback функция даже не вызывается?
2. Смотри, что у тебя происходит. При открытии какого нибудь приложения, работающего с клавиатурой, к нему подгружается твоя dll-ка с хуком, которая начинает работать в контексте этого процесса. Параметр Patch, что ты передаешь в StartHookKey передается только в экземпляр dll, подгружаемой в адрессное пространство твоего процесса, в чужих процессах данная функция не вызывается, поэтому файл не создается.
3. Вообще такое решение нехорошее. Даже если путь к файлу передавать, к примеру, через файловое отображение в память, то представь, несколько процессов подгрузили твою dll-ку и каждый пытается открыть и записать что то в один и тот же файл - ничего хорошего из этого не выйдет.
Лучше, записывай в файл из своего приложения-экзешника, а данные из dll-лек передавай посредством сообщения WM_COPYDATA. Хендл своего окна во все экземпляры хука передавай через файл-маппинг. По, моему, в DRKB или в DelphiWorld есть хороший пример кейлоггера.
 

vital

Больной Компом Детектед
29.01.2006
2 432
42
#5
В приложении рабочий пример и и хороший тутор по его созданию. Но все же это не лучший вариант. Я когда-то выкладывал пример кейлоггера без длл. Он уместился там срок в 20... Поиск тебе в помощь.

Сори за формат архива, но так сподручней было.
 

Вложения

vital

Больной Компом Детектед
29.01.2006
2 432
42
#6
Что-тоя не нашел тот примерчик.. Но вобщем RTFM GetAsyncKeyState. Помоему, все вокруг этого крутится..

Ещё можешь посмотртеть вот эту ветку - http://www.rohitab.com/discuss/lofiversion...php/t14008.html Там есть пара интересных примеров.
 
Статус
Закрыто для дальнейших ответов.