Закрыть обратный вызов или WM_CLOSE из ссылки HWND - PullRequest
2 голосов
/ 14 декабря 2011

Я вызываю метод winapi HtmlHelpA для отображения .chm моего приложения. Этот метод немедленно возвращает HWND, и окно справки отображается как отдельное окно.

Наряду с окном я установил таймер для этого hwnd. Моя проблема в том, что мне нужно знать, когда закрывается это окно, чтобы убить таймер.

Мой первый подход состоял в попытке зарегистрировать обратный вызов WndProc, но я не смог этого сделать, потому что я не создаю окно, у меня есть только ссылка на hwnd.

Затем я попытался с хуком (SetWindowsHookEx), но HOOKPROC не будет приводить HWND в качестве параметра для обратного вызова. Кроме того, мне нужно знать нить для этого hwnd.

Есть ли способ зарегистрировать обратный вызов, когда HWND закрывается или когда WndProc ожидает сообщения WM_CLOSE?

Ответы [ 2 ]

1 голос
/ 14 декабря 2011

Вы хотите создать подкласс окна справки. Подклассы дают вам возможность шпионить за всеми сообщениями, поступающими в окно proc. Вы делаете любую дополнительную работу, которая вам нужна, когда видите интересующее сообщение, а затем передаете сообщение в исходную оконную процедуру для нормальной обработки.

LRESULT CALLBACK MyWndProc(HWND hwnd, UINT msg, WPARAM wp, LPARAM lp);

WNDPROC fnOldProc = reinterpret_cast<WNDPROC>(::SetWindowLongPtr(hwndHelp, GWLP_WNDPROC, &MyWndProc));


LRESULT CALLBACK MyWndProc(HWND hwnd, UINT msg, WPARAM wp, LPARAM lp) {
    if (msg == WM_CLOSE) {
        // Kill your timer here.
    }
    return CallWindowProc(fnOldProc, hwnd, msg, wp, lp);
}
1 голос
/ 14 декабря 2011

При необходимости вы можете зарегистрировать процедуру нового окна для существующего окна.Ознакомьтесь с документацией по SetWindowLongPtr().

. Вызовите это так:

SetWindowLongPtr(hwnd, GWLP_WNDPROC, &MyCustomHelpWindowProc);

Просто помните, что подклассирование окон очень деликатноВозможно, вы захотите где-то сохранить старую оконную процедуру и вызвать ее вместо DefWindowProc() для сообщений, которые вас не интересуют.

...