Re: Подмена обработчика сообщений при помощи SetWindowLong
От: Melamed Россия  
Дата: 27.03.10 09:39
Оценка:
Здравствуйте, 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);


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