![]() |
Модераторы: feodorv, GremlinProg, xvr, Fixin |
![]() ![]() ![]() |
|
rang3r |
|
|||
Шустрый ![]() Профиль Группа: Участник Сообщений: 61 Регистрация: 2.4.2009 Репутация: нет Всего: нет |
Доброго всем времени суток!
Делаю лабораторную работу по Хукам, сам хук написал, все работает, но препод поставил дополнительную задачу, допустим, открыто несколько блокнотов, в одном нажимаем к.-л. символ и он должен появиться в остальных, как я понял можно оповещать все программы, подскажите как это можно реализовать. Это сообщение отредактировал(а) GremlinProg - 4.10.2010, 09:48 |
|||
|
||||
Earnest |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 5962 Регистрация: 17.6.2005 Где: Рязань Репутация: 33 Всего: 183 |
Оповещать-то можно - просто послать сообщение со специальным адресатом-окном == HWND_BROADCAST. Однако делать это нужно осторожно, ибо сообщение получат все топ-левел окна. Т.е. это не должно быть, скажем, WM_CHAR.
Если речь идет о собственном приложении, то достаточно послать специальное сообщение, например зарегистрированное (чтобы не было конфликтов), тогда остальным оно вреда не принесет - его просто проигнорируют. Но блокнот-то закрыт в этом смысле. Значит, ему надо слать именно WM_CHAR (или WM_KEYDOWN). Но только блокнотам. Т.о. вариант один: найти все открытые блокноты и слать им сообщение (кроме активного). Найти несложно - FindWindow или EnumWindows. Чтобы не делать этого при каждом нажатии клавиши, разумно составить список заранее (один раз). Но тогда нужно его как-то обновлять, чтобы подхватывать новые блокноты. Хотя для лабы, скорее всего, сойдет вариант без предварительного списка. -------------------- ... |
|||
|
||||
GremlinProg |
|
|||
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 2706 Регистрация: 9.8.2005 Где: Тюмень Репутация: 99 Всего: 106 |
бродкастом можно слать то самое уникальное сообщение (RegisterWindowMessage), которое будет обрабатываться в хуке, и из хука же, в ответ на это сообщение, посылать самому себе нужный WM_CHAR (или WM_KEYDOWN), тогда искать блокноты не придется
-------------------- "Гений всегда разумнее, чем умнее. Ум — это машина, разум — водитель этой машины." |
|||
|
||||
Earnest |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 5962 Регистрация: 17.6.2005 Где: Рязань Репутация: 33 Всего: 183 |
Хм...
А кто будет слать бродкастом спец. сообщение? Тоже хук? Ишо один? Самому себе - это кому? Хук можно поставить либо глобально, либо текущему процессу... или как-то еще? -------------------- ... |
|||
|
||||
GremlinProg |
|
|||
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 2706 Регистрация: 9.8.2005 Где: Тюмень Репутация: 99 Всего: 106 |
тот же хук, только постом (а чтобы рекурсии не было, надо конечно завести флажок) -------------------- "Гений всегда разумнее, чем умнее. Ум — это машина, разум — водитель этой машины." |
|||
|
||||
Earnest |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 5962 Регистрация: 17.6.2005 Где: Рязань Репутация: 33 Всего: 183 |
А как со вторым пунктом? Блокнот же стандартный, насколько я понимаю...
Разве что проверять в хуке, блокнот ли нынешний процесс... В принципе, что в лоб, что по лбу. -------------------- ... |
|||
|
||||
GremlinProg |
|
|||
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 2706 Регистрация: 9.8.2005 Где: Тюмень Репутация: 99 Всего: 106 |
второй, как я понял, rang3r уже сделал
фильтровать-то по разному можно: - по имени файла модуля - по имени окна или класса - вообще перехватить создание процесса (выборочно ставить хук) - зацепиться за что-нибудь в стилях или свойствах окна или в адресном пространстве - может есть какой специфичный модуль - может задача вообще запускать блокноты через свой прокси (самое очевидное решение) вобщем, по этому пункту пока больше вопросов к rang3r, если конечно оно ему вообще надо -------------------- "Гений всегда разумнее, чем умнее. Ум — это машина, разум — водитель этой машины." |
|||
|
||||
Earnest |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 5962 Регистрация: 17.6.2005 Где: Рязань Репутация: 33 Всего: 183 |
Вот-вот, а то мы тут с тобой дискутируем между собой, а оно нам надо? ![]() -------------------- ... |
|||
|
||||
rang3r |
|
|||
Шустрый ![]() Профиль Группа: Участник Сообщений: 61 Регистрация: 2.4.2009 Репутация: нет Всего: нет |
Добрый вечер, мне это надо!!! я думаю что преподавателю можно показать вариант где все окна будут оповещаться, не приведете пример такого кода или дайте пожалуйста ссылки где объясняется как это можно сделать? P.S. Да я не совсем правильно сформулировал задачу, символ должен появиться во всех блокнотах. Это сообщение отредактировал(а) rang3r - 4.10.2010, 20:37 |
|||
|
||||
icecrashldr |
|
|||
![]() Developer ![]() Профиль Группа: Участник Сообщений: 122 Регистрация: 5.7.2010 Репутация: нет Всего: нет |
Earnest, Если посылать то
WM_KEY_DOWN + WM_KEYUP, так как некоторые приложения WM_CHAR игнорят(пример cygwin X), но в блокноте будет работать. Но это не правельно ... Нужно хучить WM_KEY_DOWN + WM_KEYUP и отсылать сообщения от них. так как может быть пара(Shift+some key) Inject Dll (GetModulePath должен быть равен C:\\Windows\\system32\\notepad.exe ) CreateThread-> - get main thread (Gui thread) - get main windows подключаемся к активному блокноту(например Pipes + Mutex ). Короче это ведь лаба? а лаба должна чему то научить , так что учись, но если будут вопросы спрашивай. |
|||
|
||||
GremlinProg |
|
||||
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 2706 Регистрация: 9.8.2005 Где: Тюмень Репутация: 99 Всего: 106 |
пример кода:
код"с коленок", предполагается работа с WH_GETMESSAGE работу с GetClassName можно так заменить на GetDlgCtrlID, будет симпатичнее флагом будет выступать сам фокус, так что ничего придумывать дополнительно не надо Добавлено @ 10:56 icecrashldr, обычно WM_CHAR не игнорируют, некоторые просто забывают ставить TranslateMessage в цикл обработки сообщений ![]() еще есть пара-тройка облегченных или специфичных компонентов-велосипедов, которые EDIT рождают с нуля WM_CHAR приносит ключ уже с учетом информации о управляющих клавишах, таких как shift, для большинства приложений этого достаточно Это сообщение отредактировал(а) GremlinProg - 5.10.2010, 14:02 -------------------- "Гений всегда разумнее, чем умнее. Ум — это машина, разум — водитель этой машины." |
||||
|
|||||
icecrashldr |
|
||||||
![]() Developer ![]() Профиль Группа: Участник Сообщений: 122 Регистрация: 5.7.2010 Репутация: нет Всего: нет |
Не кто ни чего не забывает, просто отправляют скан код клавиатуры, на удаленные(ност, клинет ). Это более универсальный способ , думаю понятно почему...
пример cygwin X
Вроде бы как писал про shift для key_down и key_up. |
||||||
|
|||||||
GremlinProg |
|
|||
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 2706 Регистрация: 9.8.2005 Где: Тюмень Репутация: 99 Всего: 106 |
не надо смешивать работу GUI с работой в консоли, причем cygwin - эмулятор, ну и этим все сказано
можно и key_* обрабатывать - не принципиально, я предложил попроще Добавлено через 1 минуту и 11 секунд кстати, да, забрал лавры ![]() предложила, конечно Earnest, я поддержал -------------------- "Гений всегда разумнее, чем умнее. Ум — это машина, разум — водитель этой машины." |
|||
|
||||
Earnest |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 5962 Регистрация: 17.6.2005 Где: Рязань Репутация: 33 Всего: 183 |
Автор тебе памятник должен воздвигнуть, нерукотворный или какой сможет, за пример кода, а также доброту и победу над ленью. Послать-то легко (я имею в виду - в правильном направлении), а вот за ручку провести... ![]() -------------------- ... |
|||
|
||||
icecrashldr |
|
|||
![]() Developer ![]() Профиль Группа: Участник Сообщений: 122 Регистрация: 5.7.2010 Репутация: нет Всего: нет |
где я писал cygwin - эмулятор? Я писал cygwin X а это x11 server, так что не будем мешать GUI и консоль.. |
|||
|
||||
![]() ![]() ![]() |
Правила форума "C/C++: Системное программирование и WinAPI" | |
|
На данный раздел распространяются Правила форума и Правила раздела С++:Общие вопросы . Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Chipset, Step, Fixin, GremlinProg, xvr. feodorv. |
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | C/C++: Системное программирование и WinAPI | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |