Локальный хук

Тема в разделе "WASM.BEGINNERS", создана пользователем nitrotoluol, 10 ноя 2006.

  1. nitrotoluol

    nitrotoluol New Member

    Публикаций:
    0
    Регистрация:
    5 сен 2006
    Сообщения:
    848
    САБЖ
    Хуки, как мы знаем, бывают локальные и глобальные.
    Для вторых зачастую нужно писать длл.
    Первые же обрабатываются внутри самого процесса.
    И вроде как все просто, но возник стоп-кран.

    Вопрос. Как в многопоточном приложении поставить локальный хук на отлов нажатий клавиш во всем процессе.

    Желательно кусок кода.

    Заранее благодарен. :)
     
  2. rain

    rain New Member

    Публикаций:
    0
    Регистрация:
    22 апр 2006
    Сообщения:
    976
    т.к. процесс один то он разделяет одни проекции длл, и в данном случае абсолютно всё равно многопоточное приложени или нет
    SetWindowsHook ей просто нужно передать id процесса и lp ф-ции в данном случае можно не длл т.к. хук локальный аддрес любой процедуры, смотри ман и всё WH_KEYBOARD
    чесно не совсем понял проблемы вопроса
     
  3. Aspire

    Aspire New Member

    Публикаций:
    0
    Регистрация:
    19 май 2007
    Сообщения:
    1.028
    Запутался немного. Функция локального хука, как и процедура данной ф-ции находятся в длл вызванной из отдельного треда процесса. Какие параметры я должен передать ф-ции, чтобы прилепить локальный хук на все треды процесса ? Конкретнее, не понял какими должны быть ...
    invoke SetWindowsHookEx,WH_KEYBOARD,addr KeyboardProc,0 - ???, ???
     
  4. Aspire

    Aspire New Member

    Публикаций:
    0
    Регистрация:
    19 май 2007
    Сообщения:
    1.028
    Написал так:
    invoke GetCurrentProcessId
    invoke SetWindowsHookEx,WH_KEYBOARD,addr KeyboardProc,0,eax
    Пока что не проверял...
     
  5. Aspire

    Aspire New Member

    Публикаций:
    0
    Регистрация:
    19 май 2007
    Сообщения:
    1.028
    Друзья! Может, кто-нибудь подскажет все-таки ? Я запарился. Верхний вариант не работает. Пробовал следующий :
    Код (Text):
    1. invoke GetWindowThreadProcessId,hWndP,offset ProcessId
    2. invoke SetWindowsHookEx, WH_KEYBOARD, offset KeyProc,0, ProcessId
    . Тоже не работает. В обоих слечаях пишет в гетластеррор, что неправильный идентификатор (в последнем параметре). Где взять правильный?
    В случае invoke SetWindowsHookEx,WH_KEYBOARD,addr KeyboardProc,hInstance,0, получается глобальный, который пашет на ура, но мне его не надо...[...рвет на себе волосы...]
     
  6. Aspire

    Aspire New Member

    Публикаций:
    0
    Регистрация:
    19 май 2007
    Сообщения:
    1.028
    Aspire Придурок, надо так :
    invoke GetCurrentThreadId
    invoke SetWindowsHookEx, WH_KEYBOARD, offset KeyProc,0, eax
    .
    Учи матчасть.
     
  7. RamMerLabs

    RamMerLabs Well-Known Member

    Публикаций:
    0
    Регистрация:
    11 сен 2006
    Сообщения:
    1.426
    ого! уже сам с собой разговариваешь! :)

    сорри за оффтоп, не удержался...
     
  8. Aspire

    Aspire New Member

    Публикаций:
    0
    Регистрация:
    19 май 2007
    Сообщения:
    1.028
    Вопрос следующий. Будет ли это работать, если этот (см. выше) код находится в длл, процедура хука находится в тойже длл, длл запущена из отдельного треда процесса, а хук надо поставить на все треды данного процесса ?
    RamMerLabs
    Так ведь никто не хочет...или не знает?
     
  9. leo

    leo Active Member

    Публикаций:
    0
    Регистрация:
    4 авг 2004
    Сообщения:
    2.542
    Адрес:
    Russia
    И то, и другое ;)
    Винда работает с кучей потоков, не разделяя их по принадлежности к процессам. Поэтому хук можно поставить либо на один конкретный поток, либо на все сразу. Поэтому, если тебе нужно хучить несколько конкретных потоков, то (видимо) единственный выход - это ставить локальные хуки отдельно на каждый поток

    PS: надеюсь понятно, что хук вешается на GetMessage\PeakMessage, поэтому фактически можно поставить хук не "на все треды данного процесса", а лишь на те которые имеют собственные циклы обработки сообщений и окна, имеющие фокус ввода