mirror of
https://github.com/narzoul/DDrawCompat
synced 2024-12-30 08:55:36 +01:00
Improved logging of wParam/lParam for window messages
This commit is contained in:
parent
a75739e5da
commit
29f311ddc7
@ -5,6 +5,7 @@
|
||||
#include <ostream>
|
||||
#include <string>
|
||||
#include <type_traits>
|
||||
#include <utility>
|
||||
|
||||
#include <Windows.h>
|
||||
|
||||
@ -39,12 +40,22 @@ std::ostream& operator<<(std::ostream& os, const char* str);
|
||||
std::ostream& operator<<(std::ostream& os, const unsigned char* data);
|
||||
std::ostream& operator<<(std::ostream& os, const WCHAR* wstr);
|
||||
|
||||
template <typename T1, typename T2>
|
||||
std::ostream& operator<<(std::ostream & os, const std::pair<T1, T2> & pair)
|
||||
{
|
||||
return Compat::LogStruct(os)
|
||||
<< pair.first
|
||||
<< pair.second;
|
||||
}
|
||||
|
||||
namespace Compat
|
||||
{
|
||||
using ::operator<<;
|
||||
|
||||
namespace detail
|
||||
{
|
||||
using ::operator<<;
|
||||
|
||||
template <typename T>
|
||||
struct Hex
|
||||
{
|
||||
|
@ -156,7 +156,7 @@ namespace
|
||||
LRESULT defPaintProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam, WNDPROC origWndProc,
|
||||
[[maybe_unused]] const char* origWndProcName)
|
||||
{
|
||||
LOG_FUNC(origWndProcName, hwnd, Compat::logWm(msg), Compat::hex(wParam), Compat::hex(lParam));
|
||||
LOG_FUNC(origWndProcName, Compat::WindowMessageStruct(hwnd, msg, wParam, lParam));
|
||||
return LOG_RESULT(defPaintProc(hwnd, msg, wParam, lParam, origWndProc));
|
||||
}
|
||||
|
||||
@ -427,7 +427,7 @@ namespace
|
||||
LRESULT CALLBACK user32WndProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam,
|
||||
[[maybe_unused]] const std::string& procName, WndProcHook wndProcHook, WNDPROC oldWndProcTrampoline)
|
||||
{
|
||||
LOG_FUNC(procName.c_str(), hwnd, Compat::logWm(uMsg), Compat::hex(wParam), Compat::hex(lParam));
|
||||
LOG_FUNC(procName.c_str(), Compat::WindowMessageStruct(hwnd, uMsg, wParam, lParam));
|
||||
return LOG_RESULT(wndProcHook(hwnd, uMsg, wParam, lParam, oldWndProcTrampoline));
|
||||
}
|
||||
|
||||
|
@ -52,7 +52,7 @@ namespace
|
||||
LRESULT CALLBACK ddcWindowProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam,
|
||||
decltype(&CallWindowProcA) callWindowProc, WNDPROC wndProc)
|
||||
{
|
||||
LOG_FUNC("ddcWindowProc", hwnd, Compat::logWm(uMsg), Compat::hex(wParam), Compat::hex(lParam));
|
||||
LOG_FUNC("ddcWindowProc", Compat::WindowMessageStruct(hwnd, uMsg, wParam, lParam));
|
||||
LRESULT result = callWindowProc(wndProc, hwnd, uMsg, wParam, lParam);
|
||||
|
||||
switch (uMsg)
|
||||
|
@ -20,7 +20,7 @@ namespace
|
||||
|
||||
LRESULT CALLBACK messageWindowProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
|
||||
{
|
||||
LOG_FUNC("messageWindowProc", hwnd, Compat::logWm(uMsg), Compat::hex(wParam), Compat::hex(lParam));
|
||||
LOG_FUNC("messageWindowProc", Compat::WindowMessageStruct(hwnd, uMsg, wParam, lParam));
|
||||
switch (uMsg)
|
||||
{
|
||||
case WM_CREATEPRESENTATIONWINDOW:
|
||||
@ -69,7 +69,7 @@ namespace
|
||||
|
||||
LRESULT CALLBACK presentationWindowProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
|
||||
{
|
||||
LOG_FUNC("presentationWindowProc", hwnd, Compat::logWm(uMsg), Compat::hex(wParam), Compat::hex(lParam));
|
||||
LOG_FUNC("presentationWindowProc", Compat::WindowMessageStruct(hwnd, uMsg, wParam, lParam));
|
||||
|
||||
switch (uMsg)
|
||||
{
|
||||
|
@ -6,6 +6,24 @@
|
||||
|
||||
namespace
|
||||
{
|
||||
template <typename CreateStruct>
|
||||
std::ostream& logCreateStruct(std::ostream& os, const CreateStruct& cs)
|
||||
{
|
||||
return Compat::LogStruct(os)
|
||||
<< Compat::hex(cs.dwExStyle)
|
||||
<< cs.lpszClass
|
||||
<< cs.lpszName
|
||||
<< Compat::hex(cs.style)
|
||||
<< cs.x
|
||||
<< cs.y
|
||||
<< cs.cx
|
||||
<< cs.cy
|
||||
<< cs.hwndParent
|
||||
<< cs.hMenu
|
||||
<< cs.hInstance
|
||||
<< cs.lpCreateParams;
|
||||
}
|
||||
|
||||
template <typename DevMode>
|
||||
std::ostream& logDevMode(std::ostream& os, const DevMode& dm)
|
||||
{
|
||||
@ -16,27 +34,77 @@ namespace
|
||||
<< dm.dmDisplayFrequency
|
||||
<< dm.dmDisplayFlags;
|
||||
}
|
||||
|
||||
template <typename MdiCreateStruct>
|
||||
std::ostream& logMdiCreateStruct(std::ostream& os, const MdiCreateStruct& mcs)
|
||||
{
|
||||
return Compat::LogStruct(os)
|
||||
<< mcs.szClass
|
||||
<< mcs.szTitle
|
||||
<< mcs.hOwner
|
||||
<< mcs.x
|
||||
<< mcs.y
|
||||
<< mcs.cx
|
||||
<< mcs.cy
|
||||
<< Compat::hex(mcs.style)
|
||||
<< Compat::hex(mcs.lParam);
|
||||
}
|
||||
}
|
||||
|
||||
std::ostream& operator<<(std::ostream& os, const CWPSTRUCT& cwrp)
|
||||
std::ostream& operator<<(std::ostream& os, const COMPAREITEMSTRUCT& cis)
|
||||
{
|
||||
return Compat::LogStruct(os)
|
||||
<< Compat::logWm(cwrp.message)
|
||||
<< cwrp.hwnd
|
||||
<< Compat::hex(cwrp.wParam)
|
||||
<< Compat::hex(cwrp.lParam);
|
||||
<< cis.CtlType
|
||||
<< cis.CtlID
|
||||
<< cis.hwndItem
|
||||
<< cis.itemID1
|
||||
<< Compat::hex(cis.itemData1)
|
||||
<< cis.itemID2
|
||||
<< Compat::hex(cis.itemData2)
|
||||
<< Compat::hex(cis.dwLocaleId);
|
||||
}
|
||||
|
||||
std::ostream& operator<<(std::ostream& os, const COPYDATASTRUCT& cds)
|
||||
{
|
||||
return Compat::LogStruct(os)
|
||||
<< Compat::hex(cds.dwData)
|
||||
<< cds.cbData
|
||||
<< cds.lpData;
|
||||
}
|
||||
|
||||
std::ostream& operator<<(std::ostream& os, const CREATESTRUCTA& cs)
|
||||
{
|
||||
return logCreateStruct(os, cs);
|
||||
}
|
||||
|
||||
std::ostream& operator<<(std::ostream& os, const CREATESTRUCTW& cs)
|
||||
{
|
||||
return logCreateStruct(os, cs);
|
||||
}
|
||||
|
||||
std::ostream& operator<<(std::ostream& os, const CWPSTRUCT& cwp)
|
||||
{
|
||||
return Compat::LogStruct(os)
|
||||
<< Compat::WindowMessageStruct(cwp.hwnd, cwp.message, cwp.wParam, cwp.lParam);
|
||||
}
|
||||
|
||||
std::ostream& operator<<(std::ostream& os, const CWPRETSTRUCT& cwrp)
|
||||
{
|
||||
return Compat::LogStruct(os)
|
||||
<< Compat::logWm(cwrp.message)
|
||||
<< cwrp.hwnd
|
||||
<< Compat::hex(cwrp.wParam)
|
||||
<< Compat::hex(cwrp.lParam)
|
||||
<< Compat::WindowMessageStruct(cwrp.hwnd, cwrp.message, cwrp.wParam, cwrp.lParam)
|
||||
<< Compat::hex(cwrp.lResult);
|
||||
}
|
||||
|
||||
std::ostream& operator<<(std::ostream& os, const DELETEITEMSTRUCT& dis)
|
||||
{
|
||||
return Compat::LogStruct(os)
|
||||
<< dis.CtlType
|
||||
<< dis.CtlID
|
||||
<< dis.itemID
|
||||
<< dis.hwndItem
|
||||
<< Compat::hex(dis.itemData);
|
||||
}
|
||||
|
||||
std::ostream& operator<<(std::ostream& os, const DEVMODEA& dm)
|
||||
{
|
||||
return logDevMode(os, dm);
|
||||
@ -47,6 +115,30 @@ std::ostream& operator<<(std::ostream& os, const DEVMODEW& dm)
|
||||
return logDevMode(os, dm);
|
||||
}
|
||||
|
||||
std::ostream& operator<<(std::ostream& os, const DRAWITEMSTRUCT& dis)
|
||||
{
|
||||
return Compat::LogStruct(os)
|
||||
<< dis.CtlType
|
||||
<< dis.CtlID
|
||||
<< dis.itemID
|
||||
<< Compat::hex(dis.itemAction)
|
||||
<< Compat::hex(dis.itemState)
|
||||
<< dis.hwndItem
|
||||
<< dis.hDC
|
||||
<< dis.rcItem
|
||||
<< Compat::hex(dis.itemData);
|
||||
}
|
||||
|
||||
std::ostream& operator<<(std::ostream& os, const GESTURENOTIFYSTRUCT& gns)
|
||||
{
|
||||
return Compat::LogStruct(os)
|
||||
<< gns.cbSize
|
||||
<< Compat::hex(gns.dwFlags)
|
||||
<< gns.hwndTarget
|
||||
<< gns.ptsLocation
|
||||
<< gns.dwInstanceID;
|
||||
}
|
||||
|
||||
std::ostream& operator<<(std::ostream& os, HDC dc)
|
||||
{
|
||||
os << "DC";
|
||||
@ -59,6 +151,39 @@ std::ostream& operator<<(std::ostream& os, HDC dc)
|
||||
<< CALL_ORIG_FUNC(WindowFromDC)(dc);
|
||||
}
|
||||
|
||||
std::ostream& operator<<(std::ostream& os, const HELPINFO& hi)
|
||||
{
|
||||
Compat::LogStruct log(os);
|
||||
log << hi.cbSize
|
||||
<< hi.iContextType
|
||||
<< hi.iCtrlId;
|
||||
|
||||
if (HELPINFO_WINDOW == hi.iContextType)
|
||||
{
|
||||
log << static_cast<HWND>(hi.hItemHandle);
|
||||
}
|
||||
else
|
||||
{
|
||||
log << static_cast<HMENU>(hi.hItemHandle);
|
||||
}
|
||||
|
||||
return log
|
||||
<< hi.dwContextId
|
||||
<< hi.MousePos;
|
||||
}
|
||||
|
||||
std::ostream& operator<<(std::ostream& os, HFONT font)
|
||||
{
|
||||
LOGFONT lf = {};
|
||||
if (font)
|
||||
{
|
||||
GetObject(font, sizeof(lf), &lf);
|
||||
}
|
||||
return Compat::LogStruct(os)
|
||||
<< static_cast<void*>(font)
|
||||
<< (font ? &lf : nullptr);
|
||||
}
|
||||
|
||||
std::ostream& operator<<(std::ostream& os, HRGN rgn)
|
||||
{
|
||||
os << "RGN";
|
||||
@ -110,6 +235,54 @@ std::ostream& operator<<(std::ostream& os, HWND hwnd)
|
||||
<< Compat::hex(CALL_ORIG_FUNC(GetWindowLongA)(hwnd, GWL_EXSTYLE));
|
||||
}
|
||||
|
||||
std::ostream& operator<<(std::ostream& os, const LOGFONT& lf)
|
||||
{
|
||||
return Compat::LogStruct(os)
|
||||
<< lf.lfHeight
|
||||
<< lf.lfWidth
|
||||
<< lf.lfEscapement
|
||||
<< lf.lfOrientation
|
||||
<< lf.lfWeight
|
||||
<< static_cast<UINT>(lf.lfItalic)
|
||||
<< static_cast<UINT>(lf.lfUnderline)
|
||||
<< static_cast<UINT>(lf.lfStrikeOut)
|
||||
<< static_cast<UINT>(lf.lfCharSet)
|
||||
<< static_cast<UINT>(lf.lfOutPrecision)
|
||||
<< static_cast<UINT>(lf.lfClipPrecision)
|
||||
<< static_cast<UINT>(lf.lfQuality)
|
||||
<< Compat::hex<UINT>(lf.lfPitchAndFamily)
|
||||
<< lf.lfFaceName;
|
||||
}
|
||||
|
||||
std::ostream& operator<<(std::ostream& os, const MDICREATESTRUCTA& mcs)
|
||||
{
|
||||
return logMdiCreateStruct(os, mcs);
|
||||
}
|
||||
|
||||
std::ostream& operator<<(std::ostream& os, const MDICREATESTRUCTW& mcs)
|
||||
{
|
||||
return logMdiCreateStruct(os, mcs);
|
||||
}
|
||||
|
||||
std::ostream& operator<<(std::ostream& os, const MDINEXTMENU& mnm)
|
||||
{
|
||||
return Compat::LogStruct(os)
|
||||
<< mnm.hmenuIn
|
||||
<< mnm.hmenuNext
|
||||
<< mnm.hwndNext;
|
||||
}
|
||||
|
||||
std::ostream& operator<<(std::ostream& os, const MEASUREITEMSTRUCT& mis)
|
||||
{
|
||||
return Compat::LogStruct(os)
|
||||
<< mis.CtlType
|
||||
<< mis.CtlID
|
||||
<< mis.itemID
|
||||
<< mis.itemWidth
|
||||
<< mis.itemHeight
|
||||
<< Compat::hex(mis.itemData);
|
||||
}
|
||||
|
||||
std::ostream& operator<<(std::ostream& os, const MEMORYSTATUS& ms)
|
||||
{
|
||||
return Compat::LogStruct(os)
|
||||
@ -123,17 +296,56 @@ std::ostream& operator<<(std::ostream& os, const MEMORYSTATUS& ms)
|
||||
<< ms.dwAvailVirtual;
|
||||
}
|
||||
|
||||
std::ostream& operator<<(std::ostream& os, const MENUGETOBJECTINFO& mgoi)
|
||||
{
|
||||
return Compat::LogStruct(os)
|
||||
<< Compat::hex(mgoi.dwFlags)
|
||||
<< mgoi.uPos
|
||||
<< mgoi.hmenu
|
||||
<< static_cast<GUID*>(mgoi.riid)
|
||||
<< mgoi.pvObj;
|
||||
}
|
||||
|
||||
std::ostream& operator<<(std::ostream& os, const MINMAXINFO& mmi)
|
||||
{
|
||||
return Compat::LogStruct(os)
|
||||
<< mmi.ptReserved
|
||||
<< mmi.ptMaxSize
|
||||
<< mmi.ptMaxPosition
|
||||
<< mmi.ptMinTrackSize
|
||||
<< mmi.ptMaxTrackSize;
|
||||
}
|
||||
|
||||
std::ostream& operator<<(std::ostream& os, const MSG& msg)
|
||||
{
|
||||
return Compat::LogStruct(os)
|
||||
<< msg.hwnd
|
||||
<< Compat::logWm(msg.message)
|
||||
<< Compat::hex(msg.wParam)
|
||||
<< Compat::hex(msg.lParam)
|
||||
<< Compat::WindowMessageStruct(msg.hwnd, msg.message, msg.wParam, msg.lParam)
|
||||
<< msg.time
|
||||
<< msg.pt;
|
||||
}
|
||||
|
||||
std::ostream& operator<<(std::ostream& os, const NCCALCSIZE_PARAMS& nccs)
|
||||
{
|
||||
return Compat::LogStruct(os)
|
||||
<< Compat::array(nccs.rgrc, sizeof(nccs.rgrc) / sizeof(nccs.rgrc[0]))
|
||||
<< nccs.lppos;
|
||||
}
|
||||
|
||||
std::ostream& operator<<(std::ostream& os, const NMHDR& nm)
|
||||
{
|
||||
return Compat::LogStruct(os)
|
||||
<< nm.hwndFrom
|
||||
<< nm.idFrom
|
||||
<< Compat::hex(nm.code);
|
||||
}
|
||||
|
||||
std::ostream& operator<<(std::ostream& os, const POINTS& p)
|
||||
{
|
||||
return Compat::LogStruct(os)
|
||||
<< p.x
|
||||
<< p.y;
|
||||
}
|
||||
|
||||
std::ostream& operator<<(std::ostream& os, const RECT& rect)
|
||||
{
|
||||
return Compat::LogStruct(os)
|
||||
@ -143,12 +355,57 @@ std::ostream& operator<<(std::ostream& os, const RECT& rect)
|
||||
<< rect.bottom;
|
||||
}
|
||||
|
||||
std::ostream& operator<<(std::ostream& os, const SIZE& size)
|
||||
{
|
||||
return Compat::LogStruct(os)
|
||||
<< size.cx
|
||||
<< size.cy;
|
||||
}
|
||||
|
||||
std::ostream& operator<<(std::ostream& os, const STYLESTRUCT& ss)
|
||||
{
|
||||
return Compat::LogStruct(os)
|
||||
<< Compat::hex(ss.styleOld)
|
||||
<< Compat::hex(ss.styleNew);
|
||||
}
|
||||
|
||||
std::ostream& operator<<(std::ostream& os, const TITLEBARINFOEX& tbi)
|
||||
{
|
||||
return Compat::LogStruct(os)
|
||||
<< tbi.cbSize
|
||||
<< tbi.rcTitleBar
|
||||
<< Compat::array(tbi.rgstate, sizeof(tbi.rgstate) / sizeof(tbi.rgstate[0]))
|
||||
<< Compat::array(tbi.rgrect, sizeof(tbi.rgrect) / sizeof(tbi.rgrect[0]));
|
||||
}
|
||||
|
||||
std::ostream& operator<<(std::ostream& os, const TOUCH_HIT_TESTING_INPUT& thti)
|
||||
{
|
||||
return Compat::LogStruct(os)
|
||||
<< thti.pointerId
|
||||
<< thti.point
|
||||
<< thti.boundingBox
|
||||
<< thti.nonOccludedBoundingBox
|
||||
<< thti.orientation;
|
||||
}
|
||||
|
||||
std::ostream& operator<<(std::ostream& os, const WINDOWPOS& wp)
|
||||
{
|
||||
return Compat::LogStruct(os)
|
||||
<< wp.hwnd
|
||||
<< wp.hwndInsertAfter
|
||||
<< wp.x
|
||||
<< wp.y
|
||||
<< wp.cx
|
||||
<< wp.cy
|
||||
<< Compat::hex(wp.flags);
|
||||
}
|
||||
|
||||
namespace Compat
|
||||
{
|
||||
std::string logWm(UINT msg)
|
||||
std::ostream& operator<<(std::ostream& os, WindowMessage msg)
|
||||
{
|
||||
#define LOG_WM_CASE(msg) case msg: return #msg;
|
||||
switch (msg)
|
||||
#define LOG_WM_CASE(msg) case msg: return os << #msg;
|
||||
switch (msg.msg)
|
||||
{
|
||||
LOG_WM_CASE(WM_NULL);
|
||||
LOG_WM_CASE(WM_CREATE);
|
||||
@ -395,10 +652,289 @@ namespace Compat
|
||||
};
|
||||
#undef LOG_WM_CASE
|
||||
|
||||
std::ostringstream oss;
|
||||
oss.width(4);
|
||||
oss.fill('0');
|
||||
oss << "WM_" << std::hex << msg;
|
||||
return oss.str();
|
||||
os.width(4);
|
||||
os.fill('0');
|
||||
os << "WM_" << std::hex << msg.msg << std::dec;
|
||||
return os;
|
||||
}
|
||||
|
||||
std::ostream& operator<<(std::ostream& os, WindowMessage16 msg)
|
||||
{
|
||||
return os << WindowMessage(msg.msg);
|
||||
}
|
||||
|
||||
std::ostream& operator<<(std::ostream& os, WindowMessageStruct wm)
|
||||
{
|
||||
os << '{' << wm.hwnd << ',' << wm.msg << ',';
|
||||
|
||||
#define LOG_PARAM_CASE_1(param, msg, ...) \
|
||||
case msg: \
|
||||
static_assert(sizeof(__VA_ARGS__) == sizeof(param)); \
|
||||
os << *reinterpret_cast<const __VA_ARGS__*>(¶m); \
|
||||
break
|
||||
|
||||
#define LOG_PARAM_CASE_2(param, msg, TypeA, TypeW) \
|
||||
case msg: \
|
||||
if (IsWindowUnicode(wm.hwnd)) \
|
||||
os << reinterpret_cast<const TypeW>(param); \
|
||||
else \
|
||||
os << reinterpret_cast<const TypeA>(param); \
|
||||
break;
|
||||
|
||||
#define LOG_WPARAM_CASE_1(msg, ...) LOG_PARAM_CASE_1(wm.wParam, msg, __VA_ARGS__)
|
||||
#define LOG_WPARAM_CASE_2(msg, TypeA, TypeW) LOG_PARAM_CASE_2(wm.wParam, msg, TypeA, TypeW)
|
||||
|
||||
switch (wm.msg.msg)
|
||||
{
|
||||
LOG_WPARAM_CASE_1(WM_ACTIVATE, std::pair<WORD, WORD>);
|
||||
LOG_WPARAM_CASE_1(WM_APPCOMMAND, HWND);
|
||||
LOG_WPARAM_CASE_1(WM_ASKCBFORMATNAME, DWORD);
|
||||
LOG_WPARAM_CASE_1(WM_CHANGECBCHAIN, HWND);
|
||||
LOG_WPARAM_CASE_1(WM_CHANGEUISTATE, std::pair<WORD, Compat::detail::Hex<WORD>>);
|
||||
LOG_WPARAM_CASE_1(WM_CHARTOITEM, std::pair<WORD, WORD>);
|
||||
LOG_WPARAM_CASE_1(WM_CTLCOLORMSGBOX, HDC);
|
||||
LOG_WPARAM_CASE_1(WM_CTLCOLOREDIT, HDC);
|
||||
LOG_WPARAM_CASE_1(WM_CTLCOLORLISTBOX, HDC);
|
||||
LOG_WPARAM_CASE_1(WM_CTLCOLORBTN, HDC);
|
||||
LOG_WPARAM_CASE_1(WM_CTLCOLORDLG, HDC);
|
||||
LOG_WPARAM_CASE_1(WM_CTLCOLORSCROLLBAR, HDC);
|
||||
LOG_WPARAM_CASE_1(WM_CTLCOLORSTATIC, HDC);
|
||||
LOG_WPARAM_CASE_1(WM_COMMAND, std::pair<Compat::detail::Hex<WORD>, WORD>);
|
||||
LOG_WPARAM_CASE_1(WM_CONTEXTMENU, HWND);
|
||||
LOG_WPARAM_CASE_1(WM_COPYDATA, HWND);
|
||||
LOG_WPARAM_CASE_1(WM_DISPLAYCHANGE, INT);
|
||||
LOG_WPARAM_CASE_1(WM_DPICHANGED, std::pair<WORD, WORD>);
|
||||
LOG_WPARAM_CASE_1(WM_DRAWITEM, HWND);
|
||||
LOG_WPARAM_CASE_1(WM_ERASEBKGND, HDC);
|
||||
LOG_WPARAM_CASE_1(WM_GETDPISCALEDSIZE, DWORD);
|
||||
LOG_WPARAM_CASE_1(WM_GETTEXT, DWORD);
|
||||
LOG_WPARAM_CASE_1(WM_HOTKEY, INT);
|
||||
LOG_WPARAM_CASE_1(WM_HSCROLL, std::pair<WORD, WORD>);
|
||||
LOG_WPARAM_CASE_1(WM_HSCROLLCLIPBOARD, HWND);
|
||||
LOG_WPARAM_CASE_1(WM_ICONERASEBKGND, HDC);
|
||||
LOG_WPARAM_CASE_1(WM_INITDIALOG, HWND);
|
||||
LOG_WPARAM_CASE_1(WM_KILLFOCUS, HWND);
|
||||
LOG_WPARAM_CASE_1(WM_MDIACTIVATE, HWND);
|
||||
LOG_WPARAM_CASE_1(WM_MDIDESTROY, HWND);
|
||||
LOG_WPARAM_CASE_1(WM_MDIMAXIMIZE, HWND);
|
||||
LOG_WPARAM_CASE_1(WM_MDINEXT, HWND);
|
||||
LOG_WPARAM_CASE_1(WM_MDIRESTORE, HWND);
|
||||
LOG_WPARAM_CASE_1(WM_MENUCHAR, std::pair<Compat::detail::Hex<WORD>, Compat::detail::Hex<WORD>>);
|
||||
LOG_WPARAM_CASE_1(WM_MENUCOMMAND, DWORD);
|
||||
LOG_WPARAM_CASE_1(WM_MENUDRAG, DWORD);
|
||||
LOG_WPARAM_CASE_1(WM_MENURBUTTONUP, DWORD);
|
||||
LOG_WPARAM_CASE_1(WM_MENUSELECT, std::pair<WORD, Compat::detail::Hex<WORD>>);
|
||||
LOG_WPARAM_CASE_1(WM_MOUSEACTIVATE, HWND);
|
||||
LOG_WPARAM_CASE_1(WM_MOUSEHWHEEL, std::pair<Compat::detail::Hex<WORD>, SHORT>);
|
||||
LOG_WPARAM_CASE_1(WM_MOUSEWHEEL, std::pair<Compat::detail::Hex<WORD>, SHORT>);
|
||||
LOG_WPARAM_CASE_1(WM_NCLBUTTONDBLCLK, INT);
|
||||
LOG_WPARAM_CASE_1(WM_NCLBUTTONDOWN, INT);
|
||||
LOG_WPARAM_CASE_1(WM_NCLBUTTONUP, INT);
|
||||
LOG_WPARAM_CASE_1(WM_NCMBUTTONDBLCLK, INT);
|
||||
LOG_WPARAM_CASE_1(WM_NCMBUTTONDOWN, INT);
|
||||
LOG_WPARAM_CASE_1(WM_NCMBUTTONUP, INT);
|
||||
LOG_WPARAM_CASE_1(WM_NCMOUSEHOVER, INT);
|
||||
LOG_WPARAM_CASE_1(WM_NCMOUSEMOVE, INT);
|
||||
LOG_WPARAM_CASE_1(WM_NCPAINT, HRGN);
|
||||
LOG_WPARAM_CASE_1(WM_NCPOINTERDOWN, std::pair<WORD, SHORT>);
|
||||
LOG_WPARAM_CASE_1(WM_NCPOINTERUP, std::pair<WORD, SHORT>);
|
||||
LOG_WPARAM_CASE_1(WM_NCPOINTERUPDATE, std::pair<WORD, SHORT>);
|
||||
LOG_WPARAM_CASE_1(WM_NCXBUTTONDBLCLK, std::pair<Compat::detail::Hex<WORD>, WORD>);
|
||||
LOG_WPARAM_CASE_1(WM_NCXBUTTONDOWN, std::pair<Compat::detail::Hex<WORD>, WORD>);
|
||||
LOG_WPARAM_CASE_1(WM_NCXBUTTONUP, std::pair<Compat::detail::Hex<WORD>, WORD>);
|
||||
LOG_WPARAM_CASE_1(WM_NOTIFYFORMAT, HWND);
|
||||
LOG_WPARAM_CASE_1(WM_PALETTECHANGED, HWND);
|
||||
LOG_WPARAM_CASE_1(WM_PALETTEISCHANGING, HWND);
|
||||
LOG_WPARAM_CASE_1(WM_PARENTNOTIFY, std::pair<WindowMessage16, Compat::detail::Hex<WORD>>);
|
||||
LOG_WPARAM_CASE_1(WM_POINTERACTIVATE, std::pair<WORD, SHORT>);
|
||||
LOG_WPARAM_CASE_1(WM_POINTERDOWN, std::pair<WORD, Compat::detail::Hex<WORD>>);
|
||||
LOG_WPARAM_CASE_1(WM_POINTERENTER, std::pair<WORD, Compat::detail::Hex<WORD>>);
|
||||
LOG_WPARAM_CASE_1(WM_POINTERHWHEEL, std::pair<WORD, SHORT>);
|
||||
LOG_WPARAM_CASE_1(WM_POINTERLEAVE, std::pair<WORD, Compat::detail::Hex<WORD>>);
|
||||
LOG_WPARAM_CASE_1(WM_POINTERUP, std::pair<WORD, Compat::detail::Hex<WORD>>);
|
||||
LOG_WPARAM_CASE_1(WM_POINTERUPDATE, std::pair<WORD, Compat::detail::Hex<WORD>>);
|
||||
LOG_WPARAM_CASE_1(WM_POINTERWHEEL, std::pair<WORD, SHORT>);
|
||||
LOG_WPARAM_CASE_1(WM_PRINT, HDC);
|
||||
LOG_WPARAM_CASE_1(WM_PRINTCLIENT, HDC);
|
||||
LOG_WPARAM_CASE_1(WM_SETFOCUS, HWND);
|
||||
LOG_WPARAM_CASE_1(WM_SETFONT, HFONT);
|
||||
LOG_WPARAM_CASE_1(WM_SETHOTKEY, std::pair<Compat::detail::Hex<WORD>, Compat::detail::Hex<WORD>>);
|
||||
LOG_WPARAM_CASE_1(WM_SETTEXT, DWORD);
|
||||
LOG_WPARAM_CASE_1(WM_SIZECLIPBOARD, HWND);
|
||||
LOG_WPARAM_CASE_1(WM_STYLECHANGED, INT);
|
||||
LOG_WPARAM_CASE_1(WM_STYLECHANGING, INT);
|
||||
LOG_WPARAM_CASE_1(WM_UPDATEUISTATE, std::pair<WORD, Compat::detail::Hex<WORD>>);
|
||||
LOG_WPARAM_CASE_1(WM_VKEYTOITEM, std::pair<Compat::detail::Hex<WORD>, WORD>);
|
||||
LOG_WPARAM_CASE_1(WM_VSCROLL, std::pair<WORD, WORD>);
|
||||
LOG_WPARAM_CASE_1(WM_VSCROLLCLIPBOARD, HWND);
|
||||
LOG_WPARAM_CASE_1(WM_XBUTTONDBLCLK, std::pair<Compat::detail::Hex<WORD>, WORD>);
|
||||
LOG_WPARAM_CASE_1(WM_XBUTTONDOWN, std::pair<Compat::detail::Hex<WORD>, WORD>);
|
||||
LOG_WPARAM_CASE_1(WM_XBUTTONUP, std::pair<Compat::detail::Hex<WORD>, WORD>);
|
||||
|
||||
case WM_NEXTDLGCTL:
|
||||
if (wm.lParam)
|
||||
{
|
||||
os << reinterpret_cast<HWND>(wm.wParam);
|
||||
}
|
||||
else
|
||||
{
|
||||
os << wm.wParam;
|
||||
}
|
||||
break;
|
||||
|
||||
default:
|
||||
os << Compat::hex(wm.wParam);
|
||||
break;
|
||||
}
|
||||
|
||||
#undef LOG_WPARAM_CASE_1
|
||||
#undef LOG_WPARAM_CASE_2
|
||||
|
||||
#define LOG_LPARAM_CASE_1(msg, ...) LOG_PARAM_CASE_1(wm.lParam, msg, __VA_ARGS__)
|
||||
#define LOG_LPARAM_CASE_2(msg, TypeA, TypeW) LOG_PARAM_CASE_2(wm.lParam, msg, TypeA, TypeW)
|
||||
|
||||
os << ',';
|
||||
|
||||
switch (wm.msg.msg)
|
||||
{
|
||||
LOG_LPARAM_CASE_1(WM_ACTIVATE, HWND);
|
||||
LOG_LPARAM_CASE_2(WM_ASKCBFORMATNAME, LPCSTR, LPCWSTR);
|
||||
LOG_LPARAM_CASE_1(WM_CAPTURECHANGED, HWND);
|
||||
LOG_LPARAM_CASE_1(WM_CHANGECBCHAIN, HWND);
|
||||
LOG_LPARAM_CASE_1(WM_CHARTOITEM, HWND);
|
||||
LOG_LPARAM_CASE_1(WM_CTLCOLORMSGBOX, HWND);
|
||||
LOG_LPARAM_CASE_1(WM_CTLCOLOREDIT, HWND);
|
||||
LOG_LPARAM_CASE_1(WM_CTLCOLORLISTBOX, HWND);
|
||||
LOG_LPARAM_CASE_1(WM_CTLCOLORBTN, HWND);
|
||||
LOG_LPARAM_CASE_1(WM_CTLCOLORDLG, HWND);
|
||||
LOG_LPARAM_CASE_1(WM_CTLCOLORSCROLLBAR, HWND);
|
||||
LOG_LPARAM_CASE_1(WM_CTLCOLORSTATIC, HWND);
|
||||
LOG_LPARAM_CASE_1(WM_COMMAND, HWND);
|
||||
LOG_LPARAM_CASE_1(WM_COMPAREITEM, COMPAREITEMSTRUCT*);
|
||||
LOG_LPARAM_CASE_1(WM_CONTEXTMENU, POINTS);
|
||||
LOG_LPARAM_CASE_1(WM_COPYDATA, COPYDATASTRUCT*);
|
||||
LOG_LPARAM_CASE_2(WM_CREATE, CREATESTRUCTA*, CREATESTRUCTW*);
|
||||
LOG_LPARAM_CASE_2(WM_DEVMODECHANGE, LPCSTR, LPCWSTR);
|
||||
LOG_LPARAM_CASE_1(WM_DELETEITEM, DELETEITEMSTRUCT*);
|
||||
LOG_LPARAM_CASE_1(WM_DISPLAYCHANGE, std::pair<WORD, WORD>);
|
||||
LOG_LPARAM_CASE_1(WM_DPICHANGED, RECT*);
|
||||
LOG_LPARAM_CASE_1(WM_DRAWITEM, DRAWITEMSTRUCT*);
|
||||
LOG_LPARAM_CASE_1(WM_DWMSENDICONICTHUMBNAIL, std::pair<WORD, WORD>);
|
||||
LOG_LPARAM_CASE_1(WM_ENTERIDLE, HWND);
|
||||
LOG_LPARAM_CASE_1(WM_GESTURENOTIFY, GESTURENOTIFYSTRUCT*);
|
||||
LOG_LPARAM_CASE_1(WM_GETDLGCODE, MSG*);
|
||||
LOG_LPARAM_CASE_1(WM_GETDPISCALEDSIZE, SIZE*);
|
||||
LOG_LPARAM_CASE_1(WM_GETICON, DWORD);
|
||||
LOG_LPARAM_CASE_1(WM_GETMINMAXINFO, MINMAXINFO*);
|
||||
LOG_LPARAM_CASE_2(WM_GETTEXT, LPCSTR, LPCWSTR);
|
||||
LOG_LPARAM_CASE_1(WM_HELP, HELPINFO*);
|
||||
LOG_LPARAM_CASE_1(WM_HOTKEY, std::pair<Compat::detail::Hex<WORD>, Compat::detail::Hex<WORD>>);
|
||||
LOG_LPARAM_CASE_1(WM_HSCROLL, HWND);
|
||||
LOG_LPARAM_CASE_1(WM_HSCROLLCLIPBOARD, std::pair<WORD, WORD>);
|
||||
LOG_LPARAM_CASE_1(WM_INITMENUPOPUP, std::pair<WORD, WORD>);
|
||||
LOG_LPARAM_CASE_1(WM_LBUTTONDBLCLK, POINTS);
|
||||
LOG_LPARAM_CASE_1(WM_LBUTTONDOWN, POINTS);
|
||||
LOG_LPARAM_CASE_1(WM_LBUTTONUP, POINTS);
|
||||
LOG_LPARAM_CASE_1(WM_MBUTTONDBLCLK, POINTS);
|
||||
LOG_LPARAM_CASE_1(WM_MBUTTONDOWN, POINTS);
|
||||
LOG_LPARAM_CASE_1(WM_MBUTTONUP, POINTS);
|
||||
LOG_LPARAM_CASE_2(WM_MDICREATE, MDICREATESTRUCTA*, MDICREATESTRUCTW*);
|
||||
LOG_LPARAM_CASE_1(WM_MDIGETACTIVE, BOOL*);
|
||||
LOG_LPARAM_CASE_1(WM_MEASUREITEM, MEASUREITEMSTRUCT*);
|
||||
LOG_LPARAM_CASE_1(WM_MENUGETOBJECT, MENUGETOBJECTINFO*);
|
||||
LOG_LPARAM_CASE_1(WM_MOUSEACTIVATE, std::pair<SHORT, Compat::detail::Hex<WORD>>);
|
||||
LOG_LPARAM_CASE_1(WM_MOUSEHOVER, POINTS);
|
||||
LOG_LPARAM_CASE_1(WM_MOUSEHWHEEL, POINTS);
|
||||
LOG_LPARAM_CASE_1(WM_MOUSEMOVE, POINTS);
|
||||
LOG_LPARAM_CASE_1(WM_MOUSEWHEEL, POINTS);
|
||||
LOG_LPARAM_CASE_1(WM_MOVE, POINTS);
|
||||
LOG_LPARAM_CASE_1(WM_MOVING, RECT*);
|
||||
LOG_LPARAM_CASE_2(WM_NCCREATE, CREATESTRUCTA*, CREATESTRUCTW*);
|
||||
LOG_LPARAM_CASE_1(WM_NCHITTEST, POINTS);
|
||||
LOG_LPARAM_CASE_1(WM_NCLBUTTONDBLCLK, POINTS);
|
||||
LOG_LPARAM_CASE_1(WM_NCLBUTTONDOWN, POINTS);
|
||||
LOG_LPARAM_CASE_1(WM_NCLBUTTONUP, POINTS);
|
||||
LOG_LPARAM_CASE_1(WM_NCMBUTTONDBLCLK, POINTS);
|
||||
LOG_LPARAM_CASE_1(WM_NCMBUTTONDOWN, POINTS);
|
||||
LOG_LPARAM_CASE_1(WM_NCMBUTTONUP, POINTS);
|
||||
LOG_LPARAM_CASE_1(WM_NCMOUSEHOVER, POINTS);
|
||||
LOG_LPARAM_CASE_1(WM_NCMOUSEMOVE, POINTS);
|
||||
LOG_LPARAM_CASE_1(WM_NCPOINTERDOWN, POINTS);
|
||||
LOG_LPARAM_CASE_1(WM_NCPOINTERUP, POINTS);
|
||||
LOG_LPARAM_CASE_1(WM_NCPOINTERUPDATE, POINTS);
|
||||
LOG_LPARAM_CASE_1(WM_NCRBUTTONDBLCLK, POINTS);
|
||||
LOG_LPARAM_CASE_1(WM_NCRBUTTONDOWN, POINTS);
|
||||
LOG_LPARAM_CASE_1(WM_NCRBUTTONUP, POINTS);
|
||||
LOG_LPARAM_CASE_1(WM_NCXBUTTONDBLCLK, POINTS);
|
||||
LOG_LPARAM_CASE_1(WM_NCXBUTTONDOWN, POINTS);
|
||||
LOG_LPARAM_CASE_1(WM_NCXBUTTONUP, POINTS);
|
||||
LOG_LPARAM_CASE_1(WM_NEXTMENU, MDINEXTMENU*);
|
||||
LOG_LPARAM_CASE_1(WM_NOTIFY, NMHDR*);
|
||||
LOG_LPARAM_CASE_1(WM_PARENTNOTIFY, POINTS);
|
||||
LOG_LPARAM_CASE_1(WM_POINTERACTIVATE, HWND);
|
||||
LOG_LPARAM_CASE_1(WM_POINTERCAPTURECHANGED, HWND);
|
||||
LOG_LPARAM_CASE_1(WM_POINTERDOWN, POINTS);
|
||||
LOG_LPARAM_CASE_1(WM_POINTERENTER, POINTS);
|
||||
LOG_LPARAM_CASE_1(WM_POINTERHWHEEL, POINTS);
|
||||
LOG_LPARAM_CASE_1(WM_POINTERLEAVE, POINTS);
|
||||
LOG_LPARAM_CASE_1(WM_POINTERUP, POINTS);
|
||||
LOG_LPARAM_CASE_1(WM_POINTERUPDATE, POINTS);
|
||||
LOG_LPARAM_CASE_1(WM_POINTERWHEEL, POINTS);
|
||||
LOG_LPARAM_CASE_1(WM_RBUTTONDBLCLK, POINTS);
|
||||
LOG_LPARAM_CASE_1(WM_RBUTTONDOWN, POINTS);
|
||||
LOG_LPARAM_CASE_1(WM_RBUTTONUP, POINTS);
|
||||
LOG_LPARAM_CASE_1(WM_SETCURSOR, std::pair<SHORT, Compat::detail::Hex<WORD>>);
|
||||
LOG_LPARAM_CASE_2(WM_SETTEXT, LPCSTR, LPCWSTR);
|
||||
LOG_LPARAM_CASE_2(WM_SETTINGCHANGE, LPCSTR, LPCWSTR);
|
||||
LOG_LPARAM_CASE_1(WM_SIZE, POINTS);
|
||||
LOG_LPARAM_CASE_1(WM_SIZING, RECT*);
|
||||
LOG_LPARAM_CASE_1(WM_STYLECHANGED, STYLESTRUCT*);
|
||||
LOG_LPARAM_CASE_1(WM_STYLECHANGING, STYLESTRUCT*);
|
||||
LOG_LPARAM_CASE_1(WM_SYSCOMMAND, POINTS);
|
||||
LOG_LPARAM_CASE_1(WM_GETTITLEBARINFOEX, TITLEBARINFOEX*);
|
||||
LOG_LPARAM_CASE_1(WM_TOUCHHITTESTING, TOUCH_HIT_TESTING_INPUT*);
|
||||
LOG_LPARAM_CASE_1(WM_VKEYTOITEM, HWND);
|
||||
LOG_LPARAM_CASE_1(WM_VSCROLL, HWND);
|
||||
LOG_LPARAM_CASE_1(WM_VSCROLLCLIPBOARD, std::pair<WORD, WORD>);
|
||||
LOG_LPARAM_CASE_1(WM_WINDOWPOSCHANGED, WINDOWPOS*);
|
||||
LOG_LPARAM_CASE_1(WM_WINDOWPOSCHANGING, WINDOWPOS*);
|
||||
LOG_LPARAM_CASE_1(WM_XBUTTONDBLCLK, POINTS);
|
||||
LOG_LPARAM_CASE_1(WM_XBUTTONDOWN, POINTS);
|
||||
LOG_LPARAM_CASE_1(WM_XBUTTONUP, POINTS);
|
||||
|
||||
case WM_NCACTIVATE:
|
||||
if (-1 == wm.lParam)
|
||||
{
|
||||
os << "-1";
|
||||
}
|
||||
else
|
||||
{
|
||||
os << reinterpret_cast<HRGN>(wm.lParam);
|
||||
}
|
||||
break;
|
||||
|
||||
case WM_NCCALCSIZE:
|
||||
if (wm.wParam)
|
||||
{
|
||||
os << reinterpret_cast<NCCALCSIZE_PARAMS*>(wm.lParam);
|
||||
}
|
||||
else
|
||||
{
|
||||
os << reinterpret_cast<RECT*>(wm.lParam);
|
||||
}
|
||||
break;
|
||||
|
||||
default:
|
||||
os << Compat::hex(wm.lParam);
|
||||
break;
|
||||
}
|
||||
|
||||
#undef LOG_LPARAM_CASE_1
|
||||
#undef LOG_LPARAM_CASE_2
|
||||
#undef LOG_PARAM_CASE_1
|
||||
#undef LOG_PARAM_CASE_2
|
||||
|
||||
os << '}';
|
||||
return os;
|
||||
}
|
||||
}
|
||||
|
@ -5,18 +5,71 @@
|
||||
|
||||
#include <Windows.h>
|
||||
|
||||
std::ostream& operator<<(std::ostream& os, const CWPSTRUCT& cwrp);
|
||||
std::ostream& operator<<(std::ostream& os, const COMPAREITEMSTRUCT& cis);
|
||||
std::ostream& operator<<(std::ostream& os, const COPYDATASTRUCT& cds);
|
||||
std::ostream& operator<<(std::ostream& os, const CREATESTRUCTA& cs);
|
||||
std::ostream& operator<<(std::ostream& os, const CREATESTRUCTW& cs);
|
||||
std::ostream& operator<<(std::ostream& os, const CWPSTRUCT& cwp);
|
||||
std::ostream& operator<<(std::ostream& os, const CWPRETSTRUCT& cwrp);
|
||||
std::ostream& operator<<(std::ostream& os, const DELETEITEMSTRUCT& dis);
|
||||
std::ostream& operator<<(std::ostream& os, const DEVMODEA& dm);
|
||||
std::ostream& operator<<(std::ostream& os, const DEVMODEW& dm);
|
||||
std::ostream& operator<<(std::ostream& os, const DRAWITEMSTRUCT& dis);
|
||||
std::ostream& operator<<(std::ostream& os, const GESTURENOTIFYSTRUCT& gns);
|
||||
std::ostream& operator<<(std::ostream& os, HDC dc);
|
||||
std::ostream& operator<<(std::ostream& os, const HELPINFO& hi);
|
||||
std::ostream& operator<<(std::ostream& os, HFONT font);
|
||||
std::ostream& operator<<(std::ostream& os, HRGN rgn);
|
||||
std::ostream& operator<<(std::ostream& os, HWND hwnd);
|
||||
std::ostream& operator<<(std::ostream& os, const LOGFONT& lf);
|
||||
std::ostream& operator<<(std::ostream& os, const MDICREATESTRUCTA& mcs);
|
||||
std::ostream& operator<<(std::ostream& os, const MDICREATESTRUCTW& mcs);
|
||||
std::ostream& operator<<(std::ostream& os, const MDINEXTMENU& mnm);
|
||||
std::ostream& operator<<(std::ostream& os, const MEASUREITEMSTRUCT& mis);
|
||||
std::ostream& operator<<(std::ostream& os, const MEMORYSTATUS& ms);
|
||||
std::ostream& operator<<(std::ostream& os, const MENUGETOBJECTINFO& mgoi);
|
||||
std::ostream& operator<<(std::ostream& os, const MINMAXINFO& mmi);
|
||||
std::ostream& operator<<(std::ostream& os, const MSG& msg);
|
||||
std::ostream& operator<<(std::ostream& os, const NCCALCSIZE_PARAMS& nccs);
|
||||
std::ostream& operator<<(std::ostream& os, const NMHDR& nm);
|
||||
std::ostream& operator<<(std::ostream& os, const POINTS& p);
|
||||
std::ostream& operator<<(std::ostream& os, const RECT& rect);
|
||||
std::ostream& operator<<(std::ostream& os, const SIZE& size);
|
||||
std::ostream& operator<<(std::ostream& os, const STYLESTRUCT& ss);
|
||||
std::ostream& operator<<(std::ostream& os, const TITLEBARINFOEX& tbi);
|
||||
std::ostream& operator<<(std::ostream& os, const TOUCH_HIT_TESTING_INPUT& thti);
|
||||
std::ostream& operator<<(std::ostream& os, const WINDOWPOS& wp);
|
||||
|
||||
namespace Compat
|
||||
{
|
||||
std::string logWm(UINT msg);
|
||||
struct WindowMessage
|
||||
{
|
||||
UINT msg;
|
||||
|
||||
WindowMessage(UINT msg) : msg(msg) {}
|
||||
};
|
||||
|
||||
struct WindowMessage16
|
||||
{
|
||||
UINT16 msg;
|
||||
|
||||
WindowMessage16(UINT16 msg) : msg(msg) {}
|
||||
};
|
||||
|
||||
struct WindowMessageStruct
|
||||
{
|
||||
HWND hwnd;
|
||||
WindowMessage msg;
|
||||
WPARAM wParam;
|
||||
LPARAM lParam;
|
||||
|
||||
WindowMessageStruct(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam)
|
||||
: hwnd(hwnd), msg(msg), wParam(wParam), lParam(lParam)
|
||||
{
|
||||
}
|
||||
};
|
||||
|
||||
std::ostream& operator<<(std::ostream& os, WindowMessage msg);
|
||||
std::ostream& operator<<(std::ostream& os, WindowMessage16 msg);
|
||||
std::ostream& operator<<(std::ostream& os, WindowMessageStruct wm);
|
||||
}
|
||||
|
Loading…
x
Reference in New Issue
Block a user