![]() |
|
Модераторы: feodorv, GremlinProg, xvr, Fixin |
![]()
|
|
| 12usver12 |
|
|||
|
Бывалый ![]() Профиль Группа: Участник Сообщений: 247 Регистрация: 5.1.2007 Репутация: 1 Всего: 1 |
Есть оконная прога, которая динамически подключает длл , в длл реализованы функи и код DllMain , каким образом в длл отловить(перехватить) сообщение WM_CLOSE например, посланное этой проге ?
|
|||
|
||||
| GremlinProg |
|
|||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 2706 Регистрация: 9.8.2005 Где: Тюмень Репутация: 99 Всего: 106 |
используй сабклассинг и перехватывай все что хочешь -------------------- "Гений всегда разумнее, чем умнее. Ум — это машина, разум — водитель этой машины." |
|||
|
||||
| Earnest |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 5962 Регистрация: 17.6.2005 Где: Рязань Репутация: 33 Всего: 183 |
Или hook.
-------------------- ... |
|||
|
||||
| GremlinProg |
|
|||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 2706 Регистрация: 9.8.2005 Где: Тюмень Репутация: 99 Всего: 106 |
кстати, только заметил: название темы не соответствует ее описанию, процесс не чужой,
убираю "в контексте другого процесса"? -------------------- "Гений всегда разумнее, чем умнее. Ум — это машина, разум — водитель этой машины." |
|||
|
||||
| 12usver12 |
|
|||
|
Бывалый ![]() Профиль Группа: Участник Сообщений: 247 Регистрация: 5.1.2007 Репутация: 1 Всего: 1 |
делаю такую фичу - не работает, взял за основу пример из MSDN , в окнах я не сильно силен... что может быть не так ? |
|||
|
||||
| GremlinProg |
|
|||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 2706 Регистрация: 9.8.2005 Где: Тюмень Репутация: 99 Всего: 106 |
ничего общего с задачей этот, даже недописанный код не имеет
последовательность действий должна быть примерно такая: 1. в дллмайне, при присоединении к процессу, пускаем новый поток 2. в потоке можно перебрать потоки текущего процесса 3. найти среди них гуишный 4. перебрать для него все окна 5. найти главное 6. субклассить это окно своей оконной процедурой первый поток нужен только во избежание дедлоков (настоящих, будущих) Добавлено через 3 минуты и 59 секунд если нет желания заморачиваться, то пункты 2-5 можно заменить на любой вариант FindWindow -------------------- "Гений всегда разумнее, чем умнее. Ум — это машина, разум — водитель этой машины." |
|||
|
||||
| GremlinProg |
|
|||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 2706 Регистрация: 9.8.2005 Где: Тюмень Репутация: 99 Всего: 106 |
у тебя создается левое окно, не привязанное к главному, т.е. WM_CLOSE можешь конечно так перехватить, но только для своего же перекрытого или плавающего окна, если делать по твоему, то надо все равно найти главное окно и на нем создать дочернее, причем даже так WM_CLOSE не поймаешь так можно поймать только что-нить наподобии WM_DESTROY, т.е. определить, когда окно удалит все дочерние компоненты (включая твой) но это будет уже после WM_CLOSE вобщем, лучше сабклассинг, ну или, хук, как предлагает Earnest, просто сабклассинг немного попроще -------------------- "Гений всегда разумнее, чем умнее. Ум — это машина, разум — водитель этой машины." |
|||
|
||||
| 12usver12 |
|
|||
|
Бывалый ![]() Профиль Группа: Участник Сообщений: 247 Регистрация: 5.1.2007 Репутация: 1 Всего: 1 |
хорошо а если с хуком то я так понимаю - перехватывать GetMessage нужно и смотреть на msg.message ?
а вообще как лучше определить что окно является главным ?... |
|||
|
||||
| GremlinProg |
|
|||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 2706 Регистрация: 9.8.2005 Где: Тюмень Репутация: 99 Всего: 106 |
да, если WM_CLOSE будет укладываться в очередь потока, твой хук его перехватит в принципе, это дело индивидуальное, обычно, у такого окна нет ни родителя, ни владельца (если оно плавающее) см. GetAncestor ( правда всегда есть риск перепутать плавающее окно с обычным диалогом, вызванным через MessageBox ) лучше ориентироваться на перекрытые окна, а еще лучше - посмотреть на него из spy Добавлено @ 15:55 а еще у такого окна владельцем может быть десктоп - GetDesktopWindow Это сообщение отредактировал(а) GremlinProg - 23.4.2010, 16:14 -------------------- "Гений всегда разумнее, чем умнее. Ум — это машина, разум — водитель этой машины." |
|||
|
||||
| 12usver12 |
|
|||
|
Бывалый ![]() Профиль Группа: Участник Сообщений: 247 Регистрация: 5.1.2007 Репутация: 1 Всего: 1 |
хм вроде такой вариант идет...
|
|||
|
||||
| GremlinProg |
|
|||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 2706 Регистрация: 9.8.2005 Где: Тюмень Репутация: 99 Всего: 106 |
если такое окно единственное - можно и так :)
а вообще, база исполняемого модуля - не показатель, так можно определить только то, что процедура этого окна находится в exe, а не dll -------------------- "Гений всегда разумнее, чем умнее. Ум — это машина, разум — водитель этой машины." |
|||
|
||||
| jonie |
|
|||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 5613 Регистрация: 21.8.2005 Где: Владимир Репутация: 7 Всего: 118 |
GremlinProg, вариант вроде сервер (exe) передает клиенту (dll) указатель на callback RegistreNewOmWmMessageHandler(UMSG msg, void (*lpfnNewCallBack)(HWND, UMSG, DWORD lParam, DWORD wParam) ), который может дернуть dll и соотвественно зарегить свой обработчик через EXE не рассматривается?
Говорят же что процесс не чужой, а родной.. вероятно его можно немного подредактировать для удобства... -------------------- Что-то не поняли? -> Напейтесь до зеленых человечков... эта сверхцивилизация Вам поможет... |
|||
|
||||
| GremlinProg |
|
|||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 2706 Регистрация: 9.8.2005 Где: Тюмень Репутация: 99 Всего: 106 |
да, jonie, почему бы и нет, это было бы куда проще,
я просто полагал, что функционал исходной программы не предусматривает такого механизма ( процесс-то свой, программа, как я понял, чужая, а взаимодействие с ней осуществляется плагинами - стандартная ситуация ), кстати твой вариант - это ведь по сути тот же хук, только гибче стандартного, но было бы проще, иметь интерфейс к таким плагинам, с передачей через него дескриптора главного окна (или любого другого окна, которое выступает посредником), это тоже нормальная ситуация, думаю, нужно просто почитать документацию от разработчиков p.s.: инетерфейс не в смысле interface, а в смысле учет в исходной программе экспортируемой функции такого рода -------------------- "Гений всегда разумнее, чем умнее. Ум — это машина, разум — водитель этой машины." |
|||
|
||||
| Dem_max |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1780 Регистрация: 12.4.2007 Репутация: 16 Всего: 39 |
Я собственно делаю так
-------------------- Американские программисты долго не могли понять, почему русские при зависании Windоws всё время повторяют "Твой зайка написал" ("Yоur bunnу wrоte") |
|||
|
||||
| 12usver12 |
|
|||
|
Бывалый ![]() Профиль Группа: Участник Сообщений: 247 Регистрация: 5.1.2007 Репутация: 1 Всего: 1 |
thx Dem_max , очень хорошее решение...
хотя я уже остановился на сабклассинге
это далеко не идеальное решение, но в рамках моего случая это с головой достаточно. А вообще "главного" окна может и не быть - может быть несколько равнозначных окон, которые стоят на верхнем уровне, как показала прога wndviewer, и при корректном закрытии приложения каждое из них, получается, получает WM_CLOSE Это сообщение отредактировал(а) 12usver12 - 26.4.2010, 14:05 |
|||
|
||||
![]()
|
| Правила форума "C/C++: Системное программирование и WinAPI" | |
|
|
На данный раздел распространяются Правила форума и Правила раздела С++:Общие вопросы . Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Chipset, Step, Fixin, GremlinProg, xvr. feodorv. |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | C/C++: Системное программирование и WinAPI | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |