125 lines
3 KiB
C++
125 lines
3 KiB
C++
//-----------------------------------------------------------------------------
|
|
#include "precomp.h"
|
|
#pragma hdrstop
|
|
|
|
extern "C"
|
|
{
|
|
#include <stdexts.h>
|
|
#include <dbgeng.h>
|
|
#include <commctrl.h>
|
|
#include <comctrlp.h>
|
|
|
|
#include "msgs.h"
|
|
};
|
|
|
|
|
|
//-----------------------------------------------------------------------------
|
|
void PrintUser32Message(UINT uMsg)
|
|
{
|
|
IDebugClient* pDebugClient;
|
|
IDebugControl* pDebugControl;
|
|
|
|
if (SUCCEEDED(DebugCreate(__uuidof(IDebugClient), (void**)&pDebugClient)))
|
|
{
|
|
if (SUCCEEDED(pDebugClient->QueryInterface(__uuidof(IDebugControl), (void**)&pDebugControl)))
|
|
{
|
|
// Try calling the wm extension from userexts.dll
|
|
ULONG64 ulExtension = 0;
|
|
CHAR szMsg[64];
|
|
|
|
pDebugControl->AddExtension("userexts", DEBUG_EXTENSION_AT_ENGINE, &ulExtension);
|
|
pDebugControl->CallExtension(ulExtension, "wm", _itoa(uMsg, szMsg, 16));
|
|
|
|
pDebugControl->Release();
|
|
}
|
|
|
|
pDebugClient->Release();
|
|
}
|
|
}
|
|
|
|
|
|
//-----------------------------------------------------------------------------
|
|
void PrintRegisteredMessage(UINT uMsg)
|
|
{
|
|
CHAR szMsg[64];
|
|
|
|
if (GetClipboardFormatNameA(uMsg, szMsg, ARRAYSIZE(szMsg)))
|
|
{
|
|
Print(" %x %s\n", uMsg, szMsg);
|
|
}
|
|
else
|
|
{
|
|
Print(" %x ???\n", uMsg);
|
|
}
|
|
}
|
|
|
|
|
|
//-----------------------------------------------------------------------------
|
|
void PrintComctl32Message(UINT uMsg, HWND hwnd)
|
|
{
|
|
BOOL fMatchClass = FALSE;
|
|
BOOL fFound = FALSE;
|
|
|
|
CHAR szClassName[64];
|
|
if (hwnd && IsWindow(hwnd))
|
|
{
|
|
if (GetClassNameA(hwnd, szClassName, ARRAYSIZE(szClassName)))
|
|
{
|
|
fMatchClass = TRUE;
|
|
}
|
|
}
|
|
|
|
|
|
for (int i = 0; !IsCtrlCHit() && (i < ARRAYSIZE(rgMsgMap)); i++)
|
|
{
|
|
if ((i > 0) && // always execute first iteration, contains msgs common to all
|
|
(fMatchClass && (_stricmp(szClassName, rgMsgMap[i].szClassName) != 0)))
|
|
{
|
|
continue;
|
|
}
|
|
|
|
int j;
|
|
MSGNAME* pmm;
|
|
for (j = 0, pmm = rgMsgMap[i].rgMsgName; !IsCtrlCHit() && (j < rgMsgMap[i].chMsgName); j++)
|
|
{
|
|
if (pmm[j].uMsg == uMsg)
|
|
{
|
|
Print(" %x %-25s%s\n", pmm[j].uMsg, pmm[j].szMsg, fMatchClass ? "" : rgMsgMap[i].szFriendlyClassName);
|
|
fFound = TRUE;
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
|
|
if (!fFound)
|
|
{
|
|
Print(" %x ???\n", uMsg);
|
|
}
|
|
}
|
|
|
|
|
|
//-----------------------------------------------------------------------------
|
|
void PrintWindowMessageEx(UINT uMsg, HWND hwnd)
|
|
{
|
|
if (uMsg <= WM_USER)
|
|
{
|
|
PrintUser32Message(uMsg);
|
|
}
|
|
else if (uMsg >= 0xC000)
|
|
{
|
|
PrintRegisteredMessage(uMsg);
|
|
}
|
|
else
|
|
{
|
|
PrintComctl32Message(uMsg, hwnd);
|
|
}
|
|
}
|
|
|
|
|
|
//-----------------------------------------------------------------------------
|
|
extern "C" BOOL Iwmex(DWORD dwOpts, LPVOID pArg1, LPVOID pArg2)
|
|
{
|
|
PrintWindowMessageEx(PtrToUint(pArg1), (HWND)(HWND *)pArg2);
|
|
return TRUE;
|
|
}
|