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

Discussion in 'С/С++, C#, Rust, Swift, Go, Java, Perl, Ruby' started by hub00, 3 Jun 2008.

  1. hub00

    hub00 New Member

    Joined:
    2 Jun 2008
    Messages:
    4
    Likes Received:
    0
    Reputations:
    0
    Здравствуйте, помогите решить задачу.

    Установил глобальный hook = SetWindowsHookEx(WH_CALLWNDPROCRET, @HookProc, HInstance, 0);
    Необходимо поймать сообщение WM_SETCURSOR.
    После запуска программы вылетает "Ошибка чтения памяти и её адрес"
    Однако если использовать hook WH_JOURNALRECORD то программа запускается и такие сообщения как:
    WM_MOUSEMOVE, WM_LBUTTONDOWN, WM_LBUTTONUP, WM_RBUTTONDOWN, WM_RBUTTONUP, WM_KEYUP, WM_KEYDOWN
    ловятся.
    А вот WM_SETCURSOR Нет.
    Может я что-то не указываю? Или это сообщение нужно обрабатывать как-то?

    Спасибо.

    Листинг :

    var
    HookHandle: hHook;

    function HookProc(Code: integer; WParam: word; LParam: Longint): Longint; stdcall;
    var
    msg: PEVENTMSG;
    begin
    if Code >= 0 then begin
    result := 0;
    msg := Pointer(LParam);
    with Form1 do
    case msg.message of

    WM_SETCURSOR : Label1.Caption:='Сообщение получено.';

    end;
    end else
    result := CallNextHookEx(HookHandle, code, WParam, LParam);
    end;

    procedure TForm1.FormCreate(Sender: TObject);
    begin
    HookHandle := SetWindowsHookEx(WH_CALLWNDPROCRET, @HookProc, HInstance, 0);
    end;

    procedure TForm1.FormDestroy(Sender: TObject);
    begin
    if HookHandle <> 0 then
    UnhookWindowsHookEx(HookHandle);
    end;
     
  2. Jes

    Jes Elder - Старейшина

    Joined:
    16 Apr 2007
    Messages:
    370
    Likes Received:
    391
    Reputations:
    34
    HookProc у тебя в dll находится?
     
    1 person likes this.
  3. hub00

    hub00 New Member

    Joined:
    2 Jun 2008
    Messages:
    4
    Likes Received:
    0
    Reputations:
    0
    нет. Все в одном.
     
  4. Jes

    Jes Elder - Старейшина

    Joined:
    16 Apr 2007
    Messages:
    370
    Likes Received:
    391
    Reputations:
    34
    msdn
    вообщем обработчик глобального хука должен быть расположен в dll (как раз чтобы избежать проблем с доступом к памяти и тп ...)

    ну и коротенький экскурс ( http://www.delphisources.ru/pages/faq/base/create_hook.html )
    Подробнее о механизме хуков :http://sources.ru/delphi/dll/hooks_aspects.shtml

    Лучше (понятнее) всего о хуках и перехватах у Рихтера описанно
     
    #4 Jes, 3 Jun 2008
    Last edited: 3 Jun 2008
  5. hub00

    hub00 New Member

    Joined:
    2 Jun 2008
    Messages:
    4
    Likes Received:
    0
    Reputations:
    0
    Изучал я их :(.
    Вроде ж делаю как в них и описывается.
     
  6. 0verbreaK

    0verbreaK Elder - Старейшина

    Joined:
    30 Apr 2008
    Messages:
    318
    Likes Received:
    42
    Reputations:
    -3

    Вот хорошая статья, с практическим рассмотрением хуков, на мышку, правда язык, ассемблер.
    http://www.wasm.ru/article.php?article=1001024
     
    1 person likes this.
  7. hub00

    hub00 New Member

    Joined:
    2 Jun 2008
    Messages:
    4
    Likes Received:
    0
    Reputations:
    0
    Вопрос маленький.
    Вот я получаю дескрипторе текущего курсора для текущей формы.
    a:=GetCursor();
    А как сделать так чтоб я его получал за её пределами (глобальный дескриптор курсор)?