Хочется при помощи SetWindowLong поменять обработчик сообщений на свой. Всё проходит успешно, однако при завершении программы процесс не завершается корректно, остаётся в списке процессов в диспетчере задач.
В интернете нашёл, что при закрытии стоит менять адрес обработчика на старый. Однако это не помогает
В этом примере при выборе какого-либо пункта меню вместо обработки этого пункта показывается MessageBox с uMsg, wParam и lParam.
Примечательно, что если раскомментировать второй SetWindowLong, то MessageBox, конечно же, появится всего лишь один раз, но зато программа завершится корректно.
Стоит Windows 7, если это существенно.
Заранее спасибо.
Re: Подмена обработчика сообщений при помощи SetWindowLong
Здравствуйте, Dr.Korbin, Вы писали:
DK>Здравствуйте!
DK>Хочется при помощи SetWindowLong поменять обработчик сообщений на свой. Всё проходит успешно, однако при завершении программы процесс не завершается корректно, остаётся в списке процессов в диспетчере задач.
DK>В интернете нашёл, что при закрытии стоит менять адрес обработчика на старый. Однако это не помогает
DK>В этом примере при выборе какого-либо пункта меню вместо обработки этого пункта показывается MessageBox с uMsg, wParam и lParam.
DK>
DK>Примечательно, что если раскомментировать второй SetWindowLong, то MessageBox, конечно же, появится всего лишь один раз, но зато программа завершится корректно.
DK>Стоит Windows 7, если это существенно.
DK>Заранее спасибо.
В этом случае попробуй вместо закоментированной строчки поставить строчку
но я что-то не вижу как приведенный код может повлиять на "процесс не завершается корректно, остаётся в списке процессов в диспетчере задач."; потоков нет, которые как-либо связанны с этим "пунктом меню"? может на событии остается ждать, стек смотрел?
Здравствуйте, Dr.Korbin, Вы писали:
DK>Примечательно, что если раскомментировать второй SetWindowLong, то MessageBox, конечно же, появится всего лишь один раз, но зато программа завершится корректно.
DK>Стоит Windows 7, если это существенно.
Интересно, а зачем понадобилось подменять оконную процедуру для окна верхнего уровня(WM_CLOSE вы для кого ловите?) Обычно это окно и так ваше =))
Очевидно что WM_CLOSE не доходит до дефотного обработчика, соответственно не заканчивается цикл обработки сообщений. Проверяйте что вы вызываете.
Re: Подмена обработчика сообщений при помощи SetWindowLong
Здравствуйте, Dr.Korbin, Вы писали:
DK>Примечательно, что если раскомментировать второй SetWindowLong, то MessageBox, конечно же, появится всего лишь один раз, но зато программа завершится корректно.
Отсюда мысль, вызывается ли вообще WM_CLOSE или WM_DESTROY? Есть подозрение, что нет.
Надо попробовать обработать WM_NCDESTROY, хотя, если уже NcDestroy, то уже поздно рассабклашиваться поэтому лучше спаем посмотреть это НЕсабклашеное окно и посмотреть, какие сообщения к нему приходят(но не факт, что именно им обрабатываются) в момент закрытия.