Подмена обработчика сообщений при помощи SetWindowLong
От: Dr.Korbin  
Дата: 26.03.10 22:45
Оценка:
Здравствуйте!

Хочется при помощи 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, если это существенно.

Заранее спасибо.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.