// This is a part of the Microsoft Foundation Classes C++ library. // Copyright (C) 1992-1998 Microsoft Corporation // All rights reserved. // // This source code is only intended as a supplement to the // Microsoft Foundation Classes Reference and related // electronic documentation provided with the library. // See these sources for detailed information regarding the // Microsoft Foundation Classes product. #include "stdafx.h" #ifdef _DEBUG // entire file for debugging #ifdef AFX_DBG1_SEG #pragma code_seg(AFX_DBG1_SEG) #endif #include "dde.h" #ifdef _DEBUG #undef THIS_FILE static char THIS_FILE[] = __FILE__; #endif ///////////////////////////////////////////////////////////////////////////// // Build data tables by including data file three times struct AFX_MAP_MESSAGE { UINT nMsg; LPCSTR lpszMsg; }; #define DEFINE_MESSAGE(wm) { wm, #wm } static const AFX_MAP_MESSAGE allMessages[] = { DEFINE_MESSAGE(WM_CREATE), DEFINE_MESSAGE(WM_DESTROY), DEFINE_MESSAGE(WM_MOVE), DEFINE_MESSAGE(WM_SIZE), DEFINE_MESSAGE(WM_ACTIVATE), DEFINE_MESSAGE(WM_SETFOCUS), DEFINE_MESSAGE(WM_KILLFOCUS), DEFINE_MESSAGE(WM_ENABLE), DEFINE_MESSAGE(WM_SETREDRAW), DEFINE_MESSAGE(WM_SETTEXT), DEFINE_MESSAGE(WM_GETTEXT), DEFINE_MESSAGE(WM_GETTEXTLENGTH), DEFINE_MESSAGE(WM_PAINT), DEFINE_MESSAGE(WM_CLOSE), DEFINE_MESSAGE(WM_QUERYENDSESSION), DEFINE_MESSAGE(WM_QUIT), DEFINE_MESSAGE(WM_QUERYOPEN), DEFINE_MESSAGE(WM_ERASEBKGND), DEFINE_MESSAGE(WM_SYSCOLORCHANGE), DEFINE_MESSAGE(WM_ENDSESSION), DEFINE_MESSAGE(WM_SHOWWINDOW), DEFINE_MESSAGE(WM_CTLCOLORMSGBOX), DEFINE_MESSAGE(WM_CTLCOLOREDIT), DEFINE_MESSAGE(WM_CTLCOLORLISTBOX), DEFINE_MESSAGE(WM_CTLCOLORBTN), DEFINE_MESSAGE(WM_CTLCOLORDLG), DEFINE_MESSAGE(WM_CTLCOLORSCROLLBAR), DEFINE_MESSAGE(WM_CTLCOLORSTATIC), DEFINE_MESSAGE(WM_WININICHANGE), DEFINE_MESSAGE(WM_SETTINGCHANGE), DEFINE_MESSAGE(WM_DEVMODECHANGE), DEFINE_MESSAGE(WM_ACTIVATEAPP), DEFINE_MESSAGE(WM_FONTCHANGE), DEFINE_MESSAGE(WM_TIMECHANGE), DEFINE_MESSAGE(WM_CANCELMODE), DEFINE_MESSAGE(WM_SETCURSOR), DEFINE_MESSAGE(WM_MOUSEACTIVATE), DEFINE_MESSAGE(WM_CHILDACTIVATE), DEFINE_MESSAGE(WM_QUEUESYNC), DEFINE_MESSAGE(WM_GETMINMAXINFO), DEFINE_MESSAGE(WM_ICONERASEBKGND), DEFINE_MESSAGE(WM_NEXTDLGCTL), DEFINE_MESSAGE(WM_SPOOLERSTATUS), DEFINE_MESSAGE(WM_DRAWITEM), DEFINE_MESSAGE(WM_MEASUREITEM), DEFINE_MESSAGE(WM_DELETEITEM), DEFINE_MESSAGE(WM_VKEYTOITEM), DEFINE_MESSAGE(WM_CHARTOITEM), DEFINE_MESSAGE(WM_SETFONT), DEFINE_MESSAGE(WM_GETFONT), DEFINE_MESSAGE(WM_QUERYDRAGICON), DEFINE_MESSAGE(WM_COMPAREITEM), DEFINE_MESSAGE(WM_COMPACTING), DEFINE_MESSAGE(WM_NCCREATE), DEFINE_MESSAGE(WM_NCDESTROY), DEFINE_MESSAGE(WM_NCCALCSIZE), DEFINE_MESSAGE(WM_NCHITTEST), DEFINE_MESSAGE(WM_NCPAINT), DEFINE_MESSAGE(WM_NCACTIVATE), DEFINE_MESSAGE(WM_GETDLGCODE), DEFINE_MESSAGE(WM_NCMOUSEMOVE), DEFINE_MESSAGE(WM_NCLBUTTONDOWN), DEFINE_MESSAGE(WM_NCLBUTTONUP), DEFINE_MESSAGE(WM_NCLBUTTONDBLCLK), DEFINE_MESSAGE(WM_NCRBUTTONDOWN), DEFINE_MESSAGE(WM_NCRBUTTONUP), DEFINE_MESSAGE(WM_NCRBUTTONDBLCLK), DEFINE_MESSAGE(WM_NCMBUTTONDOWN), DEFINE_MESSAGE(WM_NCMBUTTONUP), DEFINE_MESSAGE(WM_NCMBUTTONDBLCLK), DEFINE_MESSAGE(WM_KEYDOWN), DEFINE_MESSAGE(WM_KEYUP), DEFINE_MESSAGE(WM_CHAR), DEFINE_MESSAGE(WM_DEADCHAR), DEFINE_MESSAGE(WM_SYSKEYDOWN), DEFINE_MESSAGE(WM_SYSKEYUP), DEFINE_MESSAGE(WM_SYSCHAR), DEFINE_MESSAGE(WM_SYSDEADCHAR), DEFINE_MESSAGE(WM_KEYLAST), DEFINE_MESSAGE(WM_INITDIALOG), DEFINE_MESSAGE(WM_COMMAND), DEFINE_MESSAGE(WM_SYSCOMMAND), DEFINE_MESSAGE(WM_TIMER), DEFINE_MESSAGE(WM_HSCROLL), DEFINE_MESSAGE(WM_VSCROLL), DEFINE_MESSAGE(WM_INITMENU), DEFINE_MESSAGE(WM_INITMENUPOPUP), DEFINE_MESSAGE(WM_MENUSELECT), DEFINE_MESSAGE(WM_MENUCHAR), DEFINE_MESSAGE(WM_ENTERIDLE), DEFINE_MESSAGE(WM_MOUSEWHEEL), DEFINE_MESSAGE(WM_MOUSEMOVE), DEFINE_MESSAGE(WM_LBUTTONDOWN), DEFINE_MESSAGE(WM_LBUTTONUP), DEFINE_MESSAGE(WM_LBUTTONDBLCLK), DEFINE_MESSAGE(WM_RBUTTONDOWN), DEFINE_MESSAGE(WM_RBUTTONUP), DEFINE_MESSAGE(WM_RBUTTONDBLCLK), DEFINE_MESSAGE(WM_MBUTTONDOWN), DEFINE_MESSAGE(WM_MBUTTONUP), DEFINE_MESSAGE(WM_MBUTTONDBLCLK), DEFINE_MESSAGE(WM_PARENTNOTIFY), DEFINE_MESSAGE(WM_MDICREATE), DEFINE_MESSAGE(WM_MDIDESTROY), DEFINE_MESSAGE(WM_MDIACTIVATE), DEFINE_MESSAGE(WM_MDIRESTORE), DEFINE_MESSAGE(WM_MDINEXT), DEFINE_MESSAGE(WM_MDIMAXIMIZE), DEFINE_MESSAGE(WM_MDITILE), DEFINE_MESSAGE(WM_MDICASCADE), DEFINE_MESSAGE(WM_MDIICONARRANGE), DEFINE_MESSAGE(WM_MDIGETACTIVE), DEFINE_MESSAGE(WM_MDISETMENU), DEFINE_MESSAGE(WM_CUT), DEFINE_MESSAGE(WM_COPYDATA), DEFINE_MESSAGE(WM_COPY), DEFINE_MESSAGE(WM_PASTE), DEFINE_MESSAGE(WM_CLEAR), DEFINE_MESSAGE(WM_UNDO), DEFINE_MESSAGE(WM_RENDERFORMAT), DEFINE_MESSAGE(WM_RENDERALLFORMATS), DEFINE_MESSAGE(WM_DESTROYCLIPBOARD), DEFINE_MESSAGE(WM_DRAWCLIPBOARD), DEFINE_MESSAGE(WM_PAINTCLIPBOARD), DEFINE_MESSAGE(WM_VSCROLLCLIPBOARD), DEFINE_MESSAGE(WM_SIZECLIPBOARD), DEFINE_MESSAGE(WM_ASKCBFORMATNAME), DEFINE_MESSAGE(WM_CHANGECBCHAIN), DEFINE_MESSAGE(WM_HSCROLLCLIPBOARD), DEFINE_MESSAGE(WM_QUERYNEWPALETTE), DEFINE_MESSAGE(WM_PALETTEISCHANGING), DEFINE_MESSAGE(WM_PALETTECHANGED), DEFINE_MESSAGE(WM_DDE_INITIATE), DEFINE_MESSAGE(WM_DDE_TERMINATE), DEFINE_MESSAGE(WM_DDE_ADVISE), DEFINE_MESSAGE(WM_DDE_UNADVISE), DEFINE_MESSAGE(WM_DDE_ACK), DEFINE_MESSAGE(WM_DDE_DATA), DEFINE_MESSAGE(WM_DDE_REQUEST), DEFINE_MESSAGE(WM_DDE_POKE), DEFINE_MESSAGE(WM_DDE_EXECUTE), DEFINE_MESSAGE(WM_DROPFILES), DEFINE_MESSAGE(WM_POWER), DEFINE_MESSAGE(WM_WINDOWPOSCHANGED), DEFINE_MESSAGE(WM_WINDOWPOSCHANGING), // MFC specific messages DEFINE_MESSAGE(WM_SIZEPARENT), DEFINE_MESSAGE(WM_SETMESSAGESTRING), DEFINE_MESSAGE(WM_IDLEUPDATECMDUI), DEFINE_MESSAGE(WM_INITIALUPDATE), DEFINE_MESSAGE(WM_COMMANDHELP), DEFINE_MESSAGE(WM_HELPHITTEST), DEFINE_MESSAGE(WM_EXITHELPMODE), DEFINE_MESSAGE(WM_HELP), DEFINE_MESSAGE(WM_NOTIFY), DEFINE_MESSAGE(WM_CONTEXTMENU), DEFINE_MESSAGE(WM_TCARD), DEFINE_MESSAGE(WM_MDIREFRESHMENU), DEFINE_MESSAGE(WM_MOVING), DEFINE_MESSAGE(WM_STYLECHANGED), DEFINE_MESSAGE(WM_STYLECHANGING), DEFINE_MESSAGE(WM_SIZING), DEFINE_MESSAGE(WM_SETHOTKEY), DEFINE_MESSAGE(WM_PRINT), DEFINE_MESSAGE(WM_PRINTCLIENT), DEFINE_MESSAGE(WM_POWERBROADCAST), DEFINE_MESSAGE(WM_HOTKEY), DEFINE_MESSAGE(WM_GETICON), DEFINE_MESSAGE(WM_EXITMENULOOP), DEFINE_MESSAGE(WM_ENTERMENULOOP), DEFINE_MESSAGE(WM_DISPLAYCHANGE), DEFINE_MESSAGE(WM_STYLECHANGED), DEFINE_MESSAGE(WM_STYLECHANGING), DEFINE_MESSAGE(WM_GETICON), DEFINE_MESSAGE(WM_SETICON), DEFINE_MESSAGE(WM_SIZING), DEFINE_MESSAGE(WM_MOVING), DEFINE_MESSAGE(WM_CAPTURECHANGED), DEFINE_MESSAGE(WM_DEVICECHANGE), DEFINE_MESSAGE(WM_PRINT), DEFINE_MESSAGE(WM_PRINTCLIENT), { 0, NULL, } // end of message list }; #undef DEFINE_MESSAGE ///////////////////////////////////////////////////////////////////////////// // DDE special case static void AFXAPI TraceDDE(LPCTSTR lpszPrefix, const MSG* pMsg) { if (pMsg->message == WM_DDE_EXECUTE) { UINT nDummy; HGLOBAL hCommands; if (!UnpackDDElParam(WM_DDE_EXECUTE, pMsg->lParam, &nDummy, (PUINT)&hCommands)) { TRACE1("Warning: Unable to unpack WM_DDE_EXECUTE lParam %08lX.\n", pMsg->lParam); return; } ASSERT(hCommands != NULL); LPCTSTR lpszCommands = (LPCTSTR)::GlobalLock(hCommands); ASSERT(lpszCommands != NULL); TRACE2("%s: Execute '%s'.\n", lpszPrefix, lpszCommands); ::GlobalUnlock(hCommands); } else if (pMsg->message == WM_DDE_ADVISE) { ATOM aItem; HGLOBAL hAdvise; if (!UnpackDDElParam(WM_DDE_ADVISE, pMsg->lParam, (PUINT)&hAdvise, (PUINT)&aItem)) { TRACE1("Warning: Unable to unpack WM_DDE_ADVISE lParam %08lX.\n", pMsg->lParam); return; } ASSERT(aItem != NULL); ASSERT(hAdvise != NULL); DDEADVISE* lpAdvise = (DDEADVISE*)::GlobalLock(hAdvise); ASSERT(lpAdvise != NULL); TCHAR szItem[80]; szItem[0] = '\0'; if (aItem != 0) ::GlobalGetAtomName(aItem, szItem, _countof(szItem)); TCHAR szFormat[80]; szFormat[0] = '\0'; if (((UINT)0xC000 <= (UINT)lpAdvise->cfFormat) && ((UINT)lpAdvise->cfFormat <= (UINT)0xFFFF)) { ::GetClipboardFormatName(lpAdvise->cfFormat, szFormat, _countof(szFormat)); // User defined clipboard formats have a range of 0xC000->0xFFFF // System clipboard formats have other ranges, but no printable // format names. } AfxTrace( _T("%s: Advise item='%s', Format='%s', Ack=%d, Defer Update= %d\n"), lpszPrefix, szItem, szFormat, lpAdvise->fAckReq, lpAdvise->fDeferUpd); ::GlobalUnlock(hAdvise); } } ///////////////////////////////////////////////////////////////////////////// void AFXAPI _AfxTraceMsg(LPCTSTR lpszPrefix, const MSG* pMsg) { ASSERT(lpszPrefix != NULL); ASSERT(pMsg != NULL); if (pMsg->message == WM_MOUSEMOVE || pMsg->message == WM_NCMOUSEMOVE || pMsg->message == WM_NCHITTEST || pMsg->message == WM_SETCURSOR || pMsg->message == WM_CTLCOLORBTN || pMsg->message == WM_CTLCOLORDLG || pMsg->message == WM_CTLCOLOREDIT || pMsg->message == WM_CTLCOLORLISTBOX || pMsg->message == WM_CTLCOLORMSGBOX || pMsg->message == WM_CTLCOLORSCROLLBAR || pMsg->message == WM_CTLCOLORSTATIC || pMsg->message == WM_ENTERIDLE || pMsg->message == WM_CANCELMODE || pMsg->message == 0x0118) // WM_SYSTIMER (caret blink) { // don't report very frequently sent messages return; } LPCSTR lpszMsgName = NULL; char szBuf[80]; // find message name if (pMsg->message >= 0xC000) { // Window message registered with 'RegisterWindowMessage' // (actually a USER atom) if (::GetClipboardFormatNameA(pMsg->message, szBuf, _countof(szBuf))) lpszMsgName = szBuf; } else if (pMsg->message >= WM_USER) { // User message wsprintfA(szBuf, "WM_USER+0x%04X", pMsg->message - WM_USER); lpszMsgName = szBuf; } else { // a system windows message const AFX_MAP_MESSAGE* pMapMsg = allMessages; for (/*null*/; pMapMsg->lpszMsg != NULL; pMapMsg++) { if (pMapMsg->nMsg == pMsg->message) { lpszMsgName = pMapMsg->lpszMsg; break; } } } if (lpszMsgName != NULL) { AfxTrace(_T("%s: hwnd=0x%04X, msg = %hs (0x%04X, 0x%08lX)\n"), lpszPrefix, (UINT)pMsg->hwnd, lpszMsgName, pMsg->wParam, pMsg->lParam); } else { AfxTrace(_T("%s: hwnd=0x%04X, msg = 0x%04X (0x%04X, 0x%08lX)\n"), lpszPrefix, (UINT)pMsg->hwnd, pMsg->message, pMsg->wParam, pMsg->lParam); } if (pMsg->message >= WM_DDE_FIRST && pMsg->message <= WM_DDE_LAST) TraceDDE(lpszPrefix, pMsg); } ///////////////////////////////////////////////////////////////////////////// #endif // _DEBUG (entire file)