| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > C/C++: Системное программирование и WinAPI > Hook WM_CLOSE |
| Автор: ApolloKiD 9.5.2012, 17:14 | ||
| Доброго времени суток всем! Встала передо мной задача хукнуть WM_CLOSE. Есть программа которая при нажатии на крести [x] сразу закрываеться даже не спрашивает мол "Вы действительно хотите закрыть окно, Да или нет". Следственно исходников программы у меня тоже нету, есть только ДЛЛ которую я подключаю к этой программе. Хук я оуществил, при нажатии на крестик выскакивает сообщение "Вы действительно хотите закрыть окно, Да или нет", но окно закрываеться даже если нажимаю "нет". Может кто-то подсказать что я не так делаю, и что надо сделать чтобы при нажатии на кнопку "Нет" окно не закрывалось. Вот код:
Заранее спасибо! |
| Автор: feodorv 9.5.2012, 20:55 |
Видимо, сообщение WM_CLOSE всё равно доходит до оконной процедуры |
| Автор: ApolloKiD 9.5.2012, 20:58 |
| А можно как-то сделать чтобы не доходило при нажатии кнопки "нет" ? |
| Автор: feodorv 9.5.2012, 21:03 |
Думаю, поставить WH_GETMESSAGE хук, и при получении WM_CLOSE и отрицательного результата от MessageBox модифицировать msg так, что оно больше не было WM_CLOSE... |
| Автор: ApolloKiD 9.5.2012, 21:11 |
| А можно примером показать ? =) |
| Автор: GremlinProg 10.5.2012, 07:32 | ||
может проще так:
|
| Автор: feodorv 10.5.2012, 09:53 | ||
А чем return 0; от return FALSE; отличается?
Полагаю, что оконная процедура уже обработала WM_CLOSE. |
| Автор: GremlinProg 10.5.2012, 09:58 |
ни чем не отличается |
| Автор: GremlinProg 10.5.2012, 10:15 | ||||
а при чем тут WH_CALLWNDPROCRET? Добавлено через 4 минуты и 56 секунд
в таком случае хук - мера лишняя, подойдет сабклассинг главного окна из DLL |
| Автор: feodorv 10.5.2012, 10:31 | ||||
Прошу прощения, не туда посмотрел)))
То есть хук вызывается до оконной процедуры. Но даже так в доке написано:
То есть WM_CLOSE всё равно уходит в оконную процедуру. А вот на что влияет возвращаемое из хука значение - вопрос интересный. В любом случае попробовать стоит (хотя возвращаемое значение 0 - стандартное, и вряд ли на что-то влияет). Только я бы делать не стал... Добавлено через 9 минут Гм. Если есть HWND главного окна... |
| Автор: feodorv 10.5.2012, 11:10 | ||
Что-то вроде такого:
|
| Автор: ApolloKiD 11.5.2012, 15:43 | ||
Извиняюсь за опоздание..
можно пример или ссылку где бы почитать о сабклассинге? пробывал ваш метод, вообще 0 реакции.. |
| Автор: feodorv 11.5.2012, 22:54 | ||
Здесь нужен глобальный хук (не локальный) и знание хендла окна. Но если хендл известен, то лучше реализовать сабклассинг. Если хендл окна неизвестен, без хука не обойтись. Выше я писал о необходимости понять, на что влияет возвращаемое из хука значение. Соответственно, можно подобрать подходящий хук. Я подобрал:
Обо всех хуках неплохо написано http://www.rsdn.ru/article/baseserv/winhooks.xml. Может, реализуете как-нибудь иначе (трудно сказать, все ли варианты закрытия окна охватывает приведённое решение). |
| Автор: ApolloKiD 11.5.2012, 23:24 |
| Спасибо большое, всё работает =) |
| Автор: feodorv 12.5.2012, 07:38 |
Работать то работает, но, может не так, как планировалось. Например, если главное окно в результате действий пользователя порождает ещё окна, то их закрытие нажатием на крестик приведёт к ненужному срабатыванию ловушки... |