![]() |
|
|
Регистрация Восстановить пароль |
Регистрация | Задать вопрос |
Заплачу за решение |
Новые сообщения |
Сообщения за день |
Расширенный поиск |
Правила |
Всё прочитано |
![]() |
|
|
Опции темы | Поиск в этой теме |
![]() |
#1 |
Пользователь
Регистрация: 29.11.2009
Сообщений: 51
|
![]()
Мне необходимо отслеживать изменения курсора в приложении, пытаюсь повесить хук на GetMessage.
Создал функцию и поместил ее в dll: Код:
Код:
![]() Подскажите в чем моя ошибка. |
![]() |
![]() |
![]() |
#2 |
добрый няша
Старожил
Регистрация: 29.10.2006
Сообщений: 4,804
|
![]()
потому что функция объявлена неправильно. Функция должна быть __stdcall. Посмотри здесь как надо объявлять.
|
![]() |
![]() |
![]() |
#3 |
Пользователь
Регистрация: 28.07.2009
Сообщений: 13
|
![]()
Конкретно подсказать не могу, но на основании своего опыта скажу. Перехватить сообщения можно только клавиатуры и мыши. Может еще что то, все не проверял. Но для того перехватывать сообщения в чужой программе, надо что бы эта программа загрузила эту DLL. Для этого надо надо узнать хендел этого процесса(программы (GetWindowThreadProcessId)), и с помощью соответствующих функций IP открыть (OpenProcess) запросить у него память(VirtualAllocEx). Затем следует разместить в этой памяти свою функцию, которая вызывает, или вернее загружает, нужную DLL. Ну а дальше все стандартно. И еще - когда вы работаете в чужой программе, следует помнить, что адресное пространство отличается от адресного пространства Вашей программы. То есть вот это
MSG * st = (MSG*)lParam; совершенно не значит то что написано. Этот указатель указывает на структуру той программы, в которой Вы делаете перехват. Если Вы обратитесь к ней из своей программы, то получите синий экран. Надо сначала получить эту структуру в выделенную память а затем с помощью ReadProcessMemory получить ее в свое адресное пространство. Ну а там уже делаете что хотите. Поищите в гугле по тем функциям API что я Вам написал, и найдете и информацию и примеры исходных кодов. |
![]() |
![]() |
![]() |
#4 |
добрый няша
Старожил
Регистрация: 29.10.2006
Сообщений: 4,804
|
![]()
не надо вводить людей в заблуждение. всё реально и всё проверено. ошибка в типе функции, она должна быть __stdcall
|
![]() |
![]() |
![]() |
#5 | |
Пользователь
Регистрация: 28.07.2009
Сообщений: 13
|
![]() Цитата:
ЗЫ Увидел Вашу ссылку на освещение данного вопроса в Вашей редакции. Спасибо. Но с памятью я ничего не напутал. Ковыряясь в чужом процессе надо помнить о виртуальности. Последний раз редактировалось was; 12.01.2010 в 15:34. |
|
![]() |
![]() |
![]() |
#6 |
Пользователь
Регистрация: 29.11.2009
Сообщений: 51
|
![]()
rpy3uH,сделал функцию __stdcall - все равно не работает.Когда ставил хук на клавиатуру все работало и без __stdcall
![]() was,насколько я понял из статьи про хуки , которую я прочитал, при глобальном хуке длл автоматически загружается во все процессы.Попробую использовать ReadProcessMemory. Последний раз редактировалось HollyPaladin; 12.01.2010 в 18:49. |
![]() |
![]() |
![]() |
#8 |
Пользователь
Регистрация: 28.07.2009
Сообщений: 13
|
![]()
У меня проекты не запустились на исполнение. Нет компоненты (насколько я понял Билдера). Давным давно пользовался BC 5.0, но теперь в винде перешел чисто на VC.
Кстати если пользоваться чисто Сишной программой, то extern "C" будет работать. А вот если из Дельфей вызывать, то надо уже для них делать __stdcall Прикол лишь в том в каком порядке будут читаться из стека данные. Вот кусок моего кода, где я в чужой программе читаю данные из статусной строки. Код:
Последний раз редактировалось rpy3uH; 15.01.2010 в 09:19. |
![]() |
![]() |
![]() |
#9 |
Форумчанин
Регистрация: 02.01.2010
Сообщений: 254
|
![]()
Лично у меня подозрение вызывает использование функции ShowMessage в обработчике хука. Попробуй заменить на MessageBox - вероятнее всего поможет.
|
![]() |
![]() |
![]() |
#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 |