我使用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);
}
知道如何发生这种情况吗?
谢谢,
罗布。
答案 0 :(得分:1)
我认为您的代码示例的问题是在子类化窗口时应该调用DefSubclassProc而不是DefWindowProc。
答案 1 :(得分:0)
我仍然不知道为什么子类化不起作用,但我能够通过使用钩子来解决它。因此,我现在使用SetWindowsHookEx()与WH_CALLWNDPROC和WH_GETMESSAGE来捕获消息,并在钩子中调用CallNextHookEx()来传递消息,而不是使用SetWindowSubclass()来捕获消息和DefWindowProc()来传递消息。这适用于子类化不会的地方。