Почему DefWindowProc() ничего не передает?

Я переклассифицировал окно, используя SetWindowSubclass(), и мой обработчик сообщений успешно вызывается, но когда я вызываю DefWindowProc() для передачи сообщений для их первоначальной обработки, никакие сообщения никогда не проходят!

Мы пишем расширение для Marmalade (комплект для кроссплатформенной мобильной разработки). Он позволяет использовать собственные расширения для конкретных платформ, и мы пишем одно для сборки Windows для настольных ПК. У нас нет прямого доступа к циклу сообщений, но мы можем создавать подклассы для самостоятельной обработки сообщений, однако мы не можем передавать сообщения обратно в Marmalade для обычной обработки.

Например, даже ничего не делая в обратном вызове, но вызывая DefWindowProc() все еще не работает:

// Initialization:
const UINT_PTR gSubClassId = NULL;
DWORD_PTR subClassCBData = NULL;
SetWindowSubclass(gMainWindow, CadUtil_WindowCB, gSubClassId, subClassCBData);
...
// Message processing callback.
static LRESULT CALLBACK CadUtil_WindowCB(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam, UINT_PTR uIdSubclass, DWORD_PTR dwRefData)
{
    // Messages are correctly diverted here, but DefWindowProc() below isn't passing them on.
    return DefWindowProc(hWnd, message, wParam, lParam);
}

Есть идеи, как это может произойти?

Спасибо,
Роб.

2 ответа

Решение

Я до сих пор не знаю, почему не работает подкласс, но я смог обойти его, используя вместо этого хуки. Поэтому вместо использования SetWindowSubclass() для перехвата сообщений и DefWindowProc() для их прохождения я теперь использую SetWindowsHookEx() с WH_CALLWNDPROC и WH_GETMESSAGE для перехвата сообщений и вызываю CallNextHookEx() в хуке для прохождения сообщений. Это работает там, где не работает подкласс.

Я думаю, что проблема с вашим примером кода состоит в том, что вы должны вызывать DefSubclassProc вместо DefWindowProc при создании подкласса окна.

Другие вопросы по тегам