在大多数情况下,您知道可以发送到窗口的消息。我强烈怀疑你可能没有为你的任务选择正确的道路。你实际上想要完成什么?即你所问的是不常见的,真正的任务很可能可以通过其他方式解决。
无论如何。如果您有一个指向某个 MFC CWnd 派生对象的指针,仍然可以“逆向工程”它是在该 CWnd* 指向的类中定义的 MFC 消息处理程序。MFC 使用 BEGIM_MESSAGE_MAP/END_MESSAGE_MAP 在映射中定义所有消息处理程序。这些宏实际上所做的是,它们定义了一个名为 GetMessageMap() 的虚拟函数和一个包含描述消息映射的结构的数据数组。所以你可以使用 wnd->GetMessageMap() 然后遍历映射的消息处理程序。每个条目都包含有关消息处理程序和映射函数的信息。请注意,GetMessageMap 是一个受保护的函数,因此要从外部访问它,您需要一个包装器。像这样的东西:
struct Accessor : public CWnd
{
// overwrite protected
virtual const AFX_MSGMAP* GetMessageMap() const { return CWnd::GetMessageMap(); }
};
Accessor* msg_map_access = (Accessor*) window;
const AFX_MSGMAP* msg_map = msg_map_access->GetMessageMap();
const AFX_MSGMAP_ENTRY* entry = msg_map->lpEntries;
while (entry->nSig != AfxSig_end)
{
/// do something with the entries
}
同样,这不是常见的做法。通常,您永远不会那样做。所以很高兴听到你需要这个的动机。