Здравствуйте, Dr.Korbin, Вы писали:
DK>Здравствуйте!
DK>Хочется при помощи SetWindowLong поменять обработчик сообщений на свой. Всё проходит успешно, однако при завершении программы процесс не завершается корректно, остаётся в списке процессов в диспетчере задач.
DK>В интернете нашёл, что при закрытии стоит менять адрес обработчика на старый. Однако это не помогает
DK>В этом примере при выборе какого-либо пункта меню вместо обработки этого пункта показывается MessageBox с uMsg, wParam и lParam.
DK>DK>...
DK> pOldProc = (WNDPROC)(SetWindowLong(hWnd, GWL_WNDPROC, (LONG)(WindowProc)));
DK>...
DK>int WindowProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
DK>{
DK> if (uMsg == WM_COMMAND)
DK> {
DK> char buf[1000];
DK> sprintf_s(buf, 999, "%d %d %d", uMsg, wParam, lParam);
DK> MessageBox(hwnd, buf, 0, 0);
DK> //SetWindowLong(hwnd, GWL_WNDPROC, (LONG)pOldProc);
DK> return TRUE;
DK> }
DK> if ((uMsg == WM_CLOSE) || (uMsg == WM_DESTROY))
DK> {
DK> SetWindowLong(hwnd, GWL_WNDPROC, (LONG)pOldProc);
DK> }
DK> return CallWindowProc(pOldProc, hwnd, uMsg, wParam, lParam);
DK>}
DK>
DK>Примечательно, что если раскомментировать второй SetWindowLong, то MessageBox, конечно же, появится всего лишь один раз, но зато программа завершится корректно.
DK>Стоит Windows 7, если это существенно.
DK>Заранее спасибо.
В этом случае попробуй вместо закоментированной строчки поставить строчку
CallWindowProc(pOldProc, hwnd, uMsg, wParam, lParam);
И посмотри что получиться. И в зависимости от результата плеши дальше.