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

Тема в разделе "Delphi - Система", создана пользователем Proger, 30 июн 2007.

Статус темы:
Закрыта.
  1. Proger

    Proger Гость

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

    ////////////////////////////////
    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 функция даже не вызывается!!!!!

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

    Заранее благодарен.
     
  2. zubr

    zubr Гость

    Глобальный хук должен быть в отдельной dll.
     
  3. Proger

    Proger Гость

    Но он и находится в отдельной dll!
     
  4. zubr

    zubr Гость

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

    vital Больной Компом Детектед
    Команда форума Web Team

    Регистрация:
    29 янв 2006
    Сообщения:
    2.474
    Симпатии:
    27
    В приложении рабочий пример и и хороший тутор по его созданию. Но все же это не лучший вариант. Я когда-то выкладывал пример кейлоггера без длл. Он уместился там срок в 20... Поиск тебе в помощь.

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

    Вложения:

    • tkserv.tar.gz
      Размер файла:
      361,4 КБ
      Просмотров:
      345
  6. vital

    vital Больной Компом Детектед
    Команда форума Web Team

    Регистрация:
    29 янв 2006
    Сообщения:
    2.474
    Симпатии:
    27
    Что-тоя не нашел тот примерчик.. Но вобщем RTFM GetAsyncKeyState. Помоему, все вокруг этого крутится..

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

Поделиться этой страницей