Здравствуйте все, в особенности люди, хоть немного знающие С++.(ну прям как я!)
В общем сразу к делу(хотя наверно все уже догадались):банальный вопрос - надо в проге отследить нажатие клавиши Х. Я вот думал не поступает ли какое событие о нажатии(не на форме естественно), или перемещении моуса(от лат. mouse).
А суть вопроса такова: При нажатии определенных клавиш(например Ctrl+I) делать какие-либо действия в проге. Сколько я пробовал такое возможно при активизированной форме, и насколько я знаю, так отслеживать клавиши можно установив хук.
Да, надо установить системный хук... обычно, чтобы перехватывать все события (сообщения) в системе, он должен находиться в dll. Но есть 2 системных хука, которые могут находиться в .ехе - это журнальные хуки
Вобще то, если я не ошибаюсь, любой вид хука может находиться как в DLL так и в EXE.
Разница в следующем: Если хук находиться в DLL, то при перхвате соответствующего сообщения, эта DLLподключится к процессу пославшему сообщение, и получит управление. После этогоможно выполнить любой код от имени 'хукнутого' процесса (это, кстати, один из методов подмены API функций). Если хук находиться в EXE, то при перхвате соответствующего сообщения, этот EXEпросто будет знать что кто то послал такое то сообщение.
>>Если хук находиться в EXE, то при перхвате соответствующего сообщения, >>этот EXE
>>просто будет знать что кто то послал такое то сообщение.
Если хук находится в .ехе, то он может перехватывать сообщения только текущего потока... остальные сообщения в системе такой хук перехватывать не будет...
Когда вы создааете хук, Windows создает в памяти структуры данных, которая содержит информацию о хуке, и добавляет ее в связанный список уже существующих хуков. Новый хук добавляется перед всеми старыми хуками. Когда случается событие, то если вы установили локальный хук, вызывается фильтрующая функция в вашем процессе, поэтому тут все просто. Hо если вы установили удаленный ху, система должна вставить код хук-процедуры в адресное пространство другого процесса. Система может сделать это только, если функция находится в DLL. Таким образом, если вы хотите использовать удаленный хук, ваша хук-процедура должна находиться в DLL. Из этого правила есть два исключения: журнально-записывающие и журнально-проигрывающие хуки. Хук-процедуры для этих типов хуков должны находиться в треде, который инсталлировал хуки. Причина этого кроется в том, что оба хука имеют дело с низкоуровневым перехватом хардварных входных событий. Эти события должны быть записаны/проиграны в том порядке, в котором они произошли. Если код такого хука находится в DLL, входные события могут быть "разбросаны" по нескольким тредам, что делает невозможным установления точной их последовательности. решение: процедуры таких хуков должна быть в одном треде, то есть в том треде, который устанавливает хуки.
Так или иначе, узнает приложение о событии или исполняет код от его имени, процедура хука должна быть в адресном пространстве удаленного приложения, поэтому мне кажется, что ты немного не прав.
Чё за... Кто знает почему:В С++ Откомпилировал пустую длл(в смысле что в ней ни одной команды-то нет, кроме return) а она весит все 200кг. Ну нифига себе! Как убрат лишний вес кто-нибудь?
> Прости, я не ясно выразился, естессно хук в EXE может перехватывать сообщения только для текущего прцесса.
>
Ну судя по написаному, в EXE можно делать любой хук, а в DLL все кроме журнальных.
Кажется, это два взаимоисключающих утверждения :O Если "хук в EXE может перехватывать сообщения только для текущего прцесса", то как "в EXE можно делать любой хук", если хуки бывают и глобльные?
> Откомпилировал пустую длл, а она весит все 200кг
Попробуй поставить компиляцию не Win32 - Debug, а Win32 - Release, тогда компилер не будет вставлять свою отладочную информацию.
О 200кг проге - менял, плохая диета, размену на это плевать.
К размышлению - я тут хотел устроить массовую установку хуков(от 0 до 1000) так где-то на 4-6 все программы успешно рухнули, но это так...к размышлению. Кстати в последнем параметре я ставил 0(хотел null-неполучилось).
Next...
я тут с сях делал глобальный хук - обделался. Мож у кого есть пример дллки с глобальным хуком.
Next...
Я тут пол-форума облазил. Нужна помощь - необходимо скрыть прогу из TaskMana, точнее найти Его лист( и сказать пару ласковых).