1

我使用 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);
}

知道这怎么会发生吗?

谢谢,
罗伯。

4

2 回答 2

1

我认为您的代码示例的问题是在子类化窗口时应该调用 DefSubclassProc 而不是 DefWindowProc。

于 2013-10-17T20:43:23.927 回答
0

我仍然不知道为什么子类化不起作用,但我可以通过使用钩子来解决它。因此,我现在使用 SetWindowsHookEx() 与 WH_CALLWNDPROC 和 WH_GETMESSAGE 来捕获消息,并在挂钩中调用 CallNextHookEx() 来传递消息,而不是使用 SetWindowSubclass() 来捕获消息和 DefWindowProc() 来传递消息。这适用于子类化不起作用的地方。

于 2013-10-04T02:09:09.653 回答