САБЖ Хуки, как мы знаем, бывают локальные и глобальные. Для вторых зачастую нужно писать длл. Первые же обрабатываются внутри самого процесса. И вроде как все просто, но возник стоп-кран. Вопрос. Как в многопоточном приложении поставить локальный хук на отлов нажатий клавиш во всем процессе. Желательно кусок кода. Заранее благодарен.
т.к. процесс один то он разделяет одни проекции длл, и в данном случае абсолютно всё равно многопоточное приложени или нет SetWindowsHook ей просто нужно передать id процесса и lp ф-ции в данном случае можно не длл т.к. хук локальный аддрес любой процедуры, смотри ман и всё WH_KEYBOARD чесно не совсем понял проблемы вопроса
Запутался немного. Функция локального хука, как и процедура данной ф-ции находятся в длл вызванной из отдельного треда процесса. Какие параметры я должен передать ф-ции, чтобы прилепить локальный хук на все треды процесса ? Конкретнее, не понял какими должны быть ... invoke SetWindowsHookEx,WH_KEYBOARD,addr KeyboardProc,0 - ???, ???
Написал так: invoke GetCurrentProcessId invoke SetWindowsHookEx,WH_KEYBOARD,addr KeyboardProc,0,eax Пока что не проверял...
Друзья! Может, кто-нибудь подскажет все-таки ? Я запарился. Верхний вариант не работает. Пробовал следующий : Код (Text): invoke GetWindowThreadProcessId,hWndP,offset ProcessId invoke SetWindowsHookEx, WH_KEYBOARD, offset KeyProc,0, ProcessId . Тоже не работает. В обоих слечаях пишет в гетластеррор, что неправильный идентификатор (в последнем параметре). Где взять правильный? В случае invoke SetWindowsHookEx,WH_KEYBOARD,addr KeyboardProc,hInstance,0, получается глобальный, который пашет на ура, но мне его не надо...[...рвет на себе волосы...]
Aspire Придурок, надо так : invoke GetCurrentThreadId invoke SetWindowsHookEx, WH_KEYBOARD, offset KeyProc,0, eax. Учи матчасть.
Вопрос следующий. Будет ли это работать, если этот (см. выше) код находится в длл, процедура хука находится в тойже длл, длл запущена из отдельного треда процесса, а хук надо поставить на все треды данного процесса ? RamMerLabs Так ведь никто не хочет...или не знает?
И то, и другое Винда работает с кучей потоков, не разделяя их по принадлежности к процессам. Поэтому хук можно поставить либо на один конкретный поток, либо на все сразу. Поэтому, если тебе нужно хучить несколько конкретных потоков, то (видимо) единственный выход - это ставить локальные хуки отдельно на каждый поток PS: надеюсь понятно, что хук вешается на GetMessage\PeakMessage, поэтому фактически можно поставить хук не "на все треды данного процесса", а лишь на те которые имеют собственные циклы обработки сообщений и окна, имеющие фокус ввода