대부분의 경우, 사용자는 창에 보낼 수있는 메시지를 알고 있습니다. 나는 당신이 당신의 임무에 맞는 길을 택하지 않을 수도 있다고 강력하게 생각합니다. 실제로 성취하려는 것은 무엇입니까? 나는. 당신이 묻는 것은 흔하지 않으며 실제 작업은 다른 방법으로 해결할 수 있습니다.
어쨌든. 일부 MFC CWnd 파생 개체에 대한 포인터가있는 경우 해당 클래스에서 정의 된 MFC 메시지 처리기를 '리버스 엔지니어링'할 수 있습니다 해당 CWnd *. MFC는, BEGIM_MESSAGE_MAP/END_MESSAGE_MAP를 사용해, 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
}
다시 말하지만 이것은 일반적인 방법이 아닙니다. 일반적으로, 당신은 그렇게하지 않습니다. 그래서 당신이 왜 이것을 필요로하는지 동기 부여를 듣는 것이 좋을 것입니다.
해당 컨트롤이있는 응용 프로그램의 소스가 있습니까? 아니면 외부 컨트롤을 조사하고 싶습니까? – mwigdahl