Почему 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);
}

Любая идея, как это может произойти?

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


person Robert Webb    schedule 25.09.2013    source источник


Ответы (2)


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

person eroy    schedule 17.10.2013

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

person Robert Webb    schedule 04.10.2013