В большинстве случаев вы знаете, какие сообщения можно отправлять в окно. Я сильно подозреваю, что вы, возможно, идете неправильным путем для своей задачи. Чего вы на самом деле пытаетесь достичь? Т.е. то, о чем вы спрашиваете, необычно, и настоящая задача, скорее всего, может быть решена другими способами.
В любом случае. Если у вас есть указатель на какой-либо объект, производный от MFC CWnd, все еще можно «реконструировать» его обработчики сообщений MFC, определенные в классе, на который указывает этот CWnd *. 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
}
Опять же, это не обычная практика; обычно вы никогда этого не делаете. Так что было бы неплохо услышать мотивацию, зачем вам это нужно.
person
Nikolay
schedule
23.12.2014