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