|
|
Регистрация Восстановить пароль |
Повторная активизация e-mail |
Регистрация | Задать вопрос |
Заплачу за решение |
Новые сообщения |
Сообщения за день |
Расширенный поиск |
Правила |
Всё прочитано |
|
|
Опции темы | Поиск в этой теме |
10.01.2010, 22:02 | #1 |
Пользователь
Регистрация: 29.11.2009
Сообщений: 51
|
Хук на GetMessage
Мне необходимо отслеживать изменения курсора в приложении, пытаюсь повесить хук на GetMessage.
Создал функцию и поместил ее в dll: Код:
Код:
Подскажите в чем моя ошибка. |
11.01.2010, 08:17 | #2 |
добрый няша
Старожил
Регистрация: 29.10.2006
Сообщений: 4,804
|
потому что функция объявлена неправильно. Функция должна быть __stdcall. Посмотри здесь как надо объявлять.
|
11.01.2010, 20:45 | #3 |
Пользователь
Регистрация: 28.07.2009
Сообщений: 13
|
Конкретно подсказать не могу, но на основании своего опыта скажу. Перехватить сообщения можно только клавиатуры и мыши. Может еще что то, все не проверял. Но для того перехватывать сообщения в чужой программе, надо что бы эта программа загрузила эту DLL. Для этого надо надо узнать хендел этого процесса(программы (GetWindowThreadProcessId)), и с помощью соответствующих функций IP открыть (OpenProcess) запросить у него память(VirtualAllocEx). Затем следует разместить в этой памяти свою функцию, которая вызывает, или вернее загружает, нужную DLL. Ну а дальше все стандартно. И еще - когда вы работаете в чужой программе, следует помнить, что адресное пространство отличается от адресного пространства Вашей программы. То есть вот это
MSG * st = (MSG*)lParam; совершенно не значит то что написано. Этот указатель указывает на структуру той программы, в которой Вы делаете перехват. Если Вы обратитесь к ней из своей программы, то получите синий экран. Надо сначала получить эту структуру в выделенную память а затем с помощью ReadProcessMemory получить ее в свое адресное пространство. Ну а там уже делаете что хотите. Поищите в гугле по тем функциям API что я Вам написал, и найдете и информацию и примеры исходных кодов. |
12.01.2010, 14:58 | #4 |
добрый няша
Старожил
Регистрация: 29.10.2006
Сообщений: 4,804
|
не надо вводить людей в заблуждение. всё реально и всё проверено. ошибка в типе функции, она должна быть __stdcall
|
12.01.2010, 15:11 | #5 | |
Пользователь
Регистрация: 28.07.2009
Сообщений: 13
|
Цитата:
ЗЫ Увидел Вашу ссылку на освещение данного вопроса в Вашей редакции. Спасибо. Но с памятью я ничего не напутал. Ковыряясь в чужом процессе надо помнить о виртуальности. Последний раз редактировалось was; 12.01.2010 в 15:34. |
|
12.01.2010, 18:45 | #6 |
Пользователь
Регистрация: 29.11.2009
Сообщений: 51
|
rpy3uH,сделал функцию __stdcall - все равно не работает.Когда ставил хук на клавиатуру все работало и без __stdcall
was,насколько я понял из статьи про хуки , которую я прочитал, при глобальном хуке длл автоматически загружается во все процессы.Попробую использовать ReadProcessMemory. Последний раз редактировалось HollyPaladin; 12.01.2010 в 18:49. |
12.01.2010, 23:06 | #8 |
Пользователь
Регистрация: 28.07.2009
Сообщений: 13
|
У меня проекты не запустились на исполнение. Нет компоненты (насколько я понял Билдера). Давным давно пользовался BC 5.0, но теперь в винде перешел чисто на VC.
Кстати если пользоваться чисто Сишной программой, то extern "C" будет работать. А вот если из Дельфей вызывать, то надо уже для них делать __stdcall Прикол лишь в том в каком порядке будут читаться из стека данные. Вот кусок моего кода, где я в чужой программе читаю данные из статусной строки. Код:
Последний раз редактировалось rpy3uH; 15.01.2010 в 09:19. |
13.01.2010, 10:27 | #9 |
Форумчанин
Регистрация: 02.01.2010
Сообщений: 254
|
Лично у меня подозрение вызывает использование функции ShowMessage в обработчике хука. Попробуй заменить на MessageBox - вероятнее всего поможет.
|
14.01.2010, 18:42 | #10 |
Пользователь
Регистрация: 29.11.2009
Сообщений: 51
|
was,я удалил из проеков tds файлы чтобы размер уменьшить(Builder создает их при компиляции) вот проекты и не запустились.
Полные версии проектов: DLL.rar HOOK.rar Я тут обнаружил если заменить в dll WM_SETCURSOR на WM_KEYDOWN , то хук работает, правда устанавливается со второго раза только(при первой установке GetLastError возвращает код 126) и снимается хук тоже не с первого раза. Значит дело именно в WM_SETCURSOR. При установке хука на WM_SETCURSOR попробовал подвигать курсор в браузуре, при клике правой кнопкой мыши выдало ошибку Acess violation user32.dll. maxionans,убрал ShowMessage,сделал вот так: Код:
|
|
Опции темы | Поиск в этой теме |
Похожие темы | ||||
Тема | Автор | Раздел | Ответов | Последнее сообщение |
Хук и потоки | Murzilka153 | Общие вопросы C/C++ | 0 | 16.10.2009 11:59 |
Сервис и хук | francyz26rus | Win Api | 0 | 19.08.2009 13:51 |
Хук на комбинацию | W0LF | Win Api | 9 | 26.07.2009 10:33 |
Хук на клаву | HellMercenaries | Общие вопросы Delphi | 3 | 23.07.2009 21:23 |
хук | rpy3uH | Win Api | 0 | 30.10.2006 20:47 |