Модераторы: feodorv, GremlinProg, xvr, Fixin

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Оповещение неактивных окон 
:(
    Опции темы
rang3r
Дата 3.10.2010, 22:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 61
Регистрация: 2.4.2009

Репутация: нет
Всего: нет



Доброго всем времени суток!
 Делаю лабораторную работу по Хукам, сам хук написал, все работает, но препод поставил дополнительную задачу, допустим, открыто несколько блокнотов, в одном нажимаем к.-л. символ и он должен появиться в остальных, как я понял можно оповещать все программы, подскажите как это можно реализовать.

Это сообщение отредактировал(а) GremlinProg - 4.10.2010, 09:48
PM MAIL Skype   Вверх
Earnest
Дата 4.10.2010, 07:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 5962
Регистрация: 17.6.2005
Где: Рязань

Репутация: 33
Всего: 183



Оповещать-то можно - просто послать сообщение со специальным адресатом-окном == HWND_BROADCAST. Однако делать это нужно осторожно, ибо сообщение получат все топ-левел окна. Т.е. это не должно быть, скажем, WM_CHAR.
Если речь идет о собственном приложении, то достаточно послать специальное сообщение, например зарегистрированное (чтобы не было конфликтов), тогда остальным оно вреда не принесет - его просто проигнорируют.
Но блокнот-то закрыт в этом смысле. Значит, ему надо слать именно WM_CHAR (или WM_KEYDOWN). Но только блокнотам. Т.о. вариант один: найти все открытые блокноты и слать им сообщение (кроме активного). Найти несложно - FindWindow или EnumWindows. Чтобы не делать этого при каждом нажатии клавиши, разумно составить список заранее (один раз). Но тогда нужно его как-то обновлять, чтобы подхватывать новые блокноты. Хотя для лабы, скорее всего, сойдет вариант без предварительного списка.


--------------------
...
PM   Вверх
GremlinProg
Дата 4.10.2010, 09:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2706
Регистрация: 9.8.2005
Где: Тюмень

Репутация: 99
Всего: 106



бродкастом можно слать то самое уникальное сообщение (RegisterWindowMessage), которое будет обрабатываться в хуке, и из хука же, в ответ на это сообщение, посылать самому себе нужный WM_CHAR (или WM_KEYDOWN), тогда искать блокноты не придется


--------------------
"Гений всегда разумнее, чем умнее. Ум — это машина, разум — водитель этой машины."
PM WWW ICQ   Вверх
Earnest
Дата 4.10.2010, 15:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 5962
Регистрация: 17.6.2005
Где: Рязань

Репутация: 33
Всего: 183



Хм...
А кто будет слать бродкастом спец. сообщение? Тоже хук? Ишо один?
Самому себе - это кому? Хук можно поставить либо глобально, либо текущему процессу... или как-то еще?


--------------------
...
PM   Вверх
GremlinProg
Дата 4.10.2010, 15:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2706
Регистрация: 9.8.2005
Где: Тюмень

Репутация: 99
Всего: 106



Цитата(Earnest @  4.10.2010,  17:03 Найти цитируемый пост)
А кто будет слать бродкастом спец. сообщение? Тоже хук? Ишо один?

тот же хук, только постом (а чтобы рекурсии не было, надо конечно завести флажок)


--------------------
"Гений всегда разумнее, чем умнее. Ум — это машина, разум — водитель этой машины."
PM WWW ICQ   Вверх
Earnest
Дата 4.10.2010, 15:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 5962
Регистрация: 17.6.2005
Где: Рязань

Репутация: 33
Всего: 183



А как со вторым пунктом? Блокнот же стандартный, насколько я понимаю... 
Разве что проверять в хуке, блокнот ли нынешний процесс... 
В принципе, что в лоб, что по лбу.


--------------------
...
PM   Вверх
GremlinProg
Дата 4.10.2010, 15:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2706
Регистрация: 9.8.2005
Где: Тюмень

Репутация: 99
Всего: 106



второй, как я понял, rang3r уже сделал

фильтровать-то по разному можно:
 - по имени файла модуля
 - по имени окна или класса
 - вообще перехватить создание процесса (выборочно ставить хук)
 - зацепиться за что-нибудь в стилях или свойствах окна или в адресном пространстве
 - может есть какой специфичный модуль
 - может задача вообще запускать блокноты через свой прокси (самое очевидное решение)

вобщем, по этому пункту пока больше вопросов к rang3r, если конечно оно ему вообще надо


--------------------
"Гений всегда разумнее, чем умнее. Ум — это машина, разум — водитель этой машины."
PM WWW ICQ   Вверх
Earnest
Дата 4.10.2010, 18:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 5962
Регистрация: 17.6.2005
Где: Рязань

Репутация: 33
Всего: 183



Цитата(GremlinProg @  4.10.2010,  16:28 Найти цитируемый пост)
если конечно оно ему вообще надо

Вот-вот, а то мы тут с тобой дискутируем между собой, а оно нам надо? smile 


--------------------
...
PM   Вверх
rang3r
Дата 4.10.2010, 20:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 61
Регистрация: 2.4.2009

Репутация: нет
Всего: нет



Цитата(Earnest @ 4.10.2010,  18:05)
Цитата(GremlinProg @  4.10.2010,  16:28 Найти цитируемый пост)
если конечно оно ему вообще надо

Вот-вот, а то мы тут с тобой дискутируем между собой, а оно нам надо? smile

Добрый вечер, мне это надо!!! 
 я думаю что преподавателю можно показать вариант где все окна будут оповещаться, не приведете пример такого кода или дайте пожалуйста ссылки где объясняется как это можно сделать?
 P.S. Да я не совсем правильно сформулировал задачу, символ должен появиться во всех блокнотах.

Это сообщение отредактировал(а) rang3r - 4.10.2010, 20:37
PM MAIL Skype   Вверх
icecrashldr
Дата 5.10.2010, 10:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


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 ).

Короче это ведь лаба? а лаба должна чему то научить , так что учись, но если будут вопросы спрашивай.
PM MAIL WWW   Вверх
GremlinProg
Дата 5.10.2010, 10:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2706
Регистрация: 9.8.2005
Где: Тюмень

Репутация: 99
Всего: 106



пример кода:
Код

...
// где-то, например, при инициализации хука
wm_hook_char = ::RegisterWindowMessage( TEXT("wm_hook_char") );
...

Код

// в самом хуке
TCHAR fn[MAX_PATH], cn[MAX_PATH];
LPCTSTR lpszFn;
HWND hwndEdit;
...
::GetModuleFileName( NULL, fn, sizeof( fn ) / sizeof( TCHAR ) );
if( lpszFn = _tcsrchr( fn, TEXT('\\') ) ){
    ++lpszFn;
}else{
    lpszFn    = fn;
}
if( !_tcsicmp( lpszFn, TEXT("notepad.exe") ) ){
    ::GetClassName( hwnd, cn, sizeof( cn ) / sizeof( TCHAR ) );
    if( !_tcsicmp( cn, TEXT("EDIT") ) ){
        if( uMsg == WM_CHAR ){
            if( ::GetFocus() == hwnd ){
                ::PostMessage( HWND_BROADCAST, wm_hook_char, wParam, lParam );
            }
        }
    }else if( uMsg == wm_hook_char ){
        hwndEdit = ::GetDlgItem( hwnd, 0x0f );
        if( hwndEdit && ( ::GetFocus() != hwndEdit ) ){
            ::SendMessage( hwnd, WM_CHAR, wParam, lParam );
        }
    }
}

код"с коленок", предполагается работа с WH_GETMESSAGE

работу с GetClassName можно так заменить на GetDlgCtrlID, будет симпатичнее

флагом будет выступать сам фокус, так что ничего придумывать дополнительно не надо

Добавлено @ 10:56
icecrashldr, обычно WM_CHAR не игнорируют,
некоторые просто забывают ставить TranslateMessage в цикл обработки сообщений smile

еще есть пара-тройка облегченных или специфичных компонентов-велосипедов, которые EDIT рождают с нуля

WM_CHAR приносит ключ уже с учетом информации о управляющих клавишах, таких как shift,
для большинства приложений этого достаточно

Это сообщение отредактировал(а) GremlinProg - 5.10.2010, 14:02


--------------------
"Гений всегда разумнее, чем умнее. Ум — это машина, разум — водитель этой машины."
PM WWW ICQ   Вверх
icecrashldr
Дата 5.10.2010, 12:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Developer
*


Профиль
Группа: Участник
Сообщений: 122
Регистрация: 5.7.2010

Репутация: нет
Всего: нет



Цитата

некоторые просто забывают ставить TranslateMessage в цикл обработки сообщений smile

Не кто ни чего не забывает, просто отправляют скан код клавиатуры, на удаленные(ност, клинет ). Это более универсальный способ , думаю понятно почему...

Цитата

icecrashldr, обычно WM_CHAR не игнорируют,
еще есть пара-тройка облегченных или специфичных компонентов-велосипедов, которые EDIT рождают с нуля

WM_CHAR приносит ключ уже с учетом информации о управляющих клавишах, таких как shift,
для большинства приложений этого достаточно 


пример cygwin X

Цитата

Нужно хучить WM_KEY_DOWN + WM_KEYUP и отсылать сообщения от них. так как может быть пара(Shift+some key)

Вроде бы как писал про shift для key_down и key_up.
PM MAIL WWW   Вверх
GremlinProg
Дата 5.10.2010, 12:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2706
Регистрация: 9.8.2005
Где: Тюмень

Репутация: 99
Всего: 106



не надо смешивать работу GUI с работой в консоли, причем cygwin - эмулятор, ну и этим все сказано
Цитата(icecrashldr @  5.10.2010,  14:08 Найти цитируемый пост)
Вроде бы как писал про shift для key_down и key_up

Цитата

волк: шапочка, возьми у мамы пирожки с капустой, я с капустой люблю
шапочка: нет, бабушка с картошкой любит
волк: зачем с картошкой, я же с капустой люблю
шапочка: ну ведь не ты их есть будешь

можно и key_* обрабатывать - не принципиально, я предложил попроще

Добавлено через 1 минуту и 11 секунд
кстати, да, забрал лавры smile
предложила, конечно Earnest, я поддержал


--------------------
"Гений всегда разумнее, чем умнее. Ум — это машина, разум — водитель этой машины."
PM WWW ICQ   Вверх
Earnest
Дата 5.10.2010, 13:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 5962
Регистрация: 17.6.2005
Где: Рязань

Репутация: 33
Всего: 183



Цитата(GremlinProg @  5.10.2010,  13:28 Найти цитируемый пост)
предложила, конечно Earnest, я поддержал 

Автор тебе памятник должен воздвигнуть, нерукотворный или какой сможет, за пример кода, а также доброту и победу над ленью.
Послать-то легко (я имею в виду - в правильном направлении), а вот за ручку провести...
 smile 



--------------------
...
PM   Вверх
icecrashldr
Дата 5.10.2010, 16:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Developer
*


Профиль
Группа: Участник
Сообщений: 122
Регистрация: 5.7.2010

Репутация: нет
Всего: нет



Цитата

не надо смешивать работу GUI с работой в консоли, причем cygwin - эмулятор, ну и этим все сказано

где я писал cygwin - эмулятор?
Я писал cygwin X а это x11 server, так что не будем мешать GUI и консоль..
PM MAIL WWW   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Системное программирование и WinAPI"
Fixin
GremlinProg
xvr
feodorv
  • Большое количество информации и примеров с использованием функций WinAPI можно найти в MSDN
  • Описание сообщений, уведомлений и примеров с использованием компонент WinAPI (BUTTON, EDIT, STATIC, и т.п.), можно найти в MSDN Control Library
  • Непосредственно, перед созданием новой темы, проверьте заголовок и удостоверьтесь, что он отражает суть обсуждения.
  • После заполнения поля "Название темы", обратите внимание на наличие и содержание панели "А здесь смотрели?", возможно Ваш вопрос уже был решен.
  • Приводите часть кода, в которой предположительно находится проблема или ошибка.
  • Если указываете код, пользуйтесь тегами [code][/code], или их кнопочными аналогами.
  • Если вопрос решен, воспользуйтесь соответствующей ссылкой, расположенной напротив названия темы.
  • Один топик - один вопрос!
  • Перед тем как создать тему - прочтите это .

На данный раздел распространяются Правила форума и Правила раздела С++:Общие вопросы .


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Chipset, Step, Fixin, GremlinProg, xvr. feodorv.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Системное программирование и WinAPI | Следующая тема »


 




[ Время генерации скрипта: 0.1075 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.