Visual Basic, .NET, ASP, VBScript
 

   
   
     

Форум - Общий форум

Страница: 1 | 2 |

 

  Вопрос: C++ и великий Hook Добавлено: 25.02.04 23:35  

Автор вопроса:  Дмитрий Щапов

Здравствуйте все, в особенности люди, хоть немного знающие С++.(ну прям как я!)

В общем сразу к делу(хотя наверно все уже догадались):банальный вопрос - надо в проге отследить нажатие клавиши Х. Я вот думал не поступает ли какое событие о нажатии(не на форме естественно), или перемещении моуса(от лат. mouse).

Ответить

  Ответы Всего ответов: 20  

Номер ответа: 1
Автор ответа:
 Chill



ICQ: 554200 

Вопросов: 101
Ответов: 343
 Профиль | | #1 Добавлено: 26.02.04 08:44

Что-то мне вопрос не совсем ясен... Ты чего узнать-то хочешь? =)

Или ты делишься с нами о своих мыслях %)

Ответить

Номер ответа: 2
Автор ответа:
 Дмитрий Щапов



Вопросов: 71
Ответов: 321
 Профиль | | #2 Добавлено: 26.02.04 18:21

А суть вопроса такова: При нажатии определенных клавиш(например Ctrl+I) делать какие-либо действия в проге. Сколько я пробовал такое возможно при активизированной форме, и насколько я знаю, так отслеживать клавиши можно установив хук.

Ответить

Номер ответа: 3
Автор ответа:
 Sharp


Лидер форума

ICQ: 216865379 

Вопросов: 106
Ответов: 9979
 Web-сайт: sharpc.livejournal.com
 Профиль | | #3
Добавлено: 26.02.04 18:25

RegisterHotKey пробовал?

Ответить

Номер ответа: 4
Автор ответа:
 Дмитрий Щапов



Вопросов: 71
Ответов: 321
 Профиль | | #4 Добавлено: 26.02.04 18:34

Так вот я и хочу узнать как установить этот хук.

Ответить

Номер ответа: 5
Автор ответа:
 Дмитрий Щапов



Вопросов: 71
Ответов: 321
 Профиль | | #5 Добавлено: 26.02.04 19:05

RegisterHotKey работает! А нельзя уследить за нажатиями мыши?

Ответить

Номер ответа: 6
Автор ответа:
 sne



Разработчик Offline Client

ICQ: 233286456 

Вопросов: 34
Ответов: 5445
 Web-сайт: hw.t-k.ru
 Профиль | | #6
Добавлено: 26.02.04 19:52

Можешь поэкспериментировать вот с этим: SetWindowsHookEx(WH_JOURNALRECORD, ...) Должно помочь!

Ответить

Номер ответа: 7
Автор ответа:
 Chill



ICQ: 554200 

Вопросов: 101
Ответов: 343
 Профиль | | #7 Добавлено: 26.02.04 21:53

Да, надо установить системный хук... обычно, чтобы перехватывать все события (сообщения) в системе, он должен находиться в dll. Но есть 2 системных хука, которые могут находиться в .ехе - это журнальные хуки =)

WH_JOURNALRECORD

WH_JOURNALPLAYBACK

Как ими пользоваться почитай тут http://rsdn.ru/article/baseserv/winhooks.xml

НО!!! у этих хуков есть один недостаток... если при установленном хуке пользователь нажмет ctrl+alt+del, то хук АВТОМАТИЧЕСКИ удалится...

Ответить

Номер ответа: 8
Автор ответа:
 Sharp


Лидер форума

ICQ: 216865379 

Вопросов: 106
Ответов: 9979
 Web-сайт: sharpc.livejournal.com
 Профиль | | #8
Добавлено: 26.02.04 23:50

А разве WH_MOUSE отменили?

Ответить

Номер ответа: 9
Автор ответа:
 Artificial Intelligence



ICQ: 275368971 

Вопросов: 8
Ответов: 131
 Профиль | | #9 Добавлено: 27.02.04 09:52

Вобще то, если я не ошибаюсь, любой вид хука может находиться как в DLL так и в EXE.

 

Разница в следующем:

     Если хук находиться в DLL, то при перхвате соответствующего сообщения, эта DLL

подключится к процессу пославшему сообщение, и получит управление. После этого

можно выполнить любой код от имени 'хукнутого' процесса (это, кстати, один из

методов подмены API функций).

   Если хук находиться в EXE, то при перхвате соответствующего сообщения, этот EXE

просто будет знать что кто то послал такое то сообщение.

 

Поправьте меня если я не прав.

Ответить

Номер ответа: 10
Автор ответа:
 Chill



ICQ: 554200 

Вопросов: 101
Ответов: 343
 Профиль | | #10 Добавлено: 27.02.04 12:40
>>Если хук находиться в EXE, то при перхвате соответствующего сообщения, >>этот EXE

>>просто будет знать что кто то послал такое то сообщение.

 

Если хук находится в .ехе, то он может перехватывать сообщения только текущего потока... остальные сообщения в системе такой хук перехватывать не будет...

Ответить

Номер ответа: 11
Автор ответа:
 Sharp


Лидер форума

ICQ: 216865379 

Вопросов: 106
Ответов: 9979
 Web-сайт: sharpc.livejournal.com
 Профиль | | #11
Добавлено: 27.02.04 13:22

2AI: Iczelion пишет, что:

Когда вы создааете хук, Windows создает в памяти структуры данных, которая содержит информацию о хуке, и добавляет ее в связанный список уже существующих хуков. Новый хук добавляется перед всеми старыми хуками. Когда случается событие, то если вы установили локальный хук, вызывается фильтрующая функция в вашем процессе, поэтому тут все просто. Hо если вы установили удаленный ху, система должна вставить код хук-процедуры в адресное пространство другого процесса. Система может сделать это только, если функция находится в DLL. Таким образом, если вы хотите использовать удаленный хук, ваша хук-процедура должна находиться в DLL. Из этого правила есть два исключения: журнально-записывающие и журнально-проигрывающие хуки. Хук-процедуры для этих типов хуков должны находиться в треде, который инсталлировал хуки. Причина этого кроется в том, что оба хука имеют дело с низкоуровневым перехватом хардварных входных событий. Эти события должны быть записаны/проиграны в том порядке, в котором они произошли. Если код такого хука находится в DLL, входные события могут быть "разбросаны" по нескольким тредам, что делает невозможным установления точной их последовательности. решение: процедуры таких хуков должна быть в одном треде, то есть в том треде, который устанавливает хуки.

Так или иначе, узнает приложение о событии или исполняет код от его имени, процедура хука должна быть в адресном пространстве удаленного приложения, поэтому мне кажется, что ты немного не прав.

Ответить

Номер ответа: 12
Автор ответа:
 Artificial Intelligence



ICQ: 275368971 

Вопросов: 8
Ответов: 131
 Профиль | | #12 Добавлено: 27.02.04 16:33

2 Chill

Прости, я не ясно выразился, естессно хук в EXE может перехватывать сообщения только для текущего прцесса.

2 Sharp

Ну судя по написаному, в EXE можно делать любой хук, а в DLL все кроме журнальных.

Ответить

Номер ответа: 13
Автор ответа:
 Дмитрий Щапов



Вопросов: 71
Ответов: 321
 Профиль | | #13 Добавлено: 27.02.04 16:40

Чё за... Кто знает почему:В С++ Откомпилировал пустую длл(в смысле что в ней ни одной команды-то нет, кроме return) а она весит все 200кг. Ну нифига себе! Как убрат лишний вес кто-нибудь?

Ответить

Номер ответа: 14
Автор ответа:
 Sharp


Лидер форума

ICQ: 216865379 

Вопросов: 106
Ответов: 9979
 Web-сайт: sharpc.livejournal.com
 Профиль | | #14
Добавлено: 27.02.04 17:23
> Прости, я не ясно выразился, естессно хук в EXE может перехватывать сообщения только для текущего прцесса.

> Ну судя по написаному, в EXE можно делать любой хук, а в DLL все кроме журнальных.

Кажется, это два взаимоисключающих утверждения :O Если "хук в EXE может перехватывать сообщения только для текущего прцесса", то как "в EXE можно делать любой хук", если хуки бывают и глобльные?

> Откомпилировал пустую длл, а она весит все 200кг

Попробуй поставить компиляцию не Win32 - Debug, а Win32 - Release, тогда компилер не будет вставлять свою отладочную информацию.

Ответить

Номер ответа: 15
Автор ответа:
 Дмитрий Щапов



Вопросов: 71
Ответов: 321
 Профиль | | #15 Добавлено: 27.02.04 21:04

О 200кг проге - менял, плохая диета, размену на это плевать.

К размышлению - я тут хотел устроить массовую установку хуков(от 0 до 1000) так где-то на 4-6 все программы успешно рухнули, но это так...к размышлению. Кстати в последнем параметре я ставил 0(хотел null-неполучилось).

Next...

я тут с сях делал глобальный хук - обделался. Мож у кого есть пример дллки с глобальным хуком.

Next...

Я тут пол-форума облазил. Нужна помощь - необходимо скрыть прогу из TaskMana, точнее найти Его лист( и сказать пару ласковых).

Ответить

Страница: 1 | 2 |

Поиск по форуму



© Copyright 2002-2011 VBNet.RU | Пишите нам