/*****************HOOKService.h***********************/ BOOL InstallOperationsHook(HWND,HINSTANCE); BOOL InstallOperationsDisplayHook(HWND,HINSTANCE); BOOL UnInstallOperationsHook(); BOOL UnInstallOperationsDisplayHook(); BOOL CheckOperationsRecordHookHandle(); BOOL CheckOperationsDisplayHookHandle(); LRESULT CALLBACK JournalPlaybackProc(int,WPARAM,LPARAM); LRESULT CALLBACK JournalRecordProc(int,WPARAM,LPARAM); LPCTSTR GetMsgName(UINT); void FreeMsgList(); /*****************HOOKService.h***********************/ /*****************HOOKService.cpp***********************/ #include "stdafx.h" #include "HOOKService.h" BOOL InstallOperationsHook(HWND hWnd,HINSTANCE hInst) { if (!UnInstallOperationsDisplayHook()) return FALSE; if (CheckOperationsRecordHookHandle()) return TRUE; g_AppInstance = hInst; g_Dlg_Hwnd = hWnd; FreeMsgList(); g_hHookOperationsRecord = ::SetWindowsHookEx(WH_JOURNALRECORD, JournalRecordProc, g_AppInstance, 0); return g_hHookOperationsRecord ? TRUE : FALSE; } BOOL InstallOperationsDisplayHook(HWND hWnd,HINSTANCE hInst) { if (!UnInstallOperationsHook()) return FALSE; if (CheckOperationsDisplayHookHandle()) return TRUE; g_AppInstance = hInst; g_Dlg_Hwnd = hWnd; g_pMsgListPrev = g_pMsgMovePtr = g_pMsgListLast = NULL; RetTime = 0; g_hHookOperationsDisplay = ::SetWindowsHookEx(WH_JOURNALPLAYBACK, JournalPlaybackProc, g_AppInstance, 0); return g_hHookOperationsDisplay ? TRUE : FALSE; } LRESULT CALLBACK JournalRecordProc(int nCode,WPARAM wParam,LPARAM lParam) { if (nCode < 0) return ::CallNextHookEx(g_hHookOperationsRecord,nCode,wParam,lParam); if (nCode == HC_ACTION) { MsgList* pTmpMsgList = new MsgList; pTmpMsgList->Event.hwnd = ((LPEVENTMSG)lParam)->hwnd; pTmpMsgList->Event.message = ((LPEVENTMSG)lParam)->message; pTmpMsgList->Event.paramH = ((LPEVENTMSG)lParam)->paramH; pTmpMsgList->Event.paramL = ((LPEVENTMSG)lParam)->paramL; pTmpMsgList->Event.time = ((LPEVENTMSG)lParam)->time; if (!g_pMsgMovePtr) { if (!g_pMsgListHeader) g_pMsgListPrev = g_pMsgListHeader = g_pMsgMovePtr = pTmpMsgList; } else { g_pMsgListLast = pTmpMsgList;/*将新消息作为最后的消息*/ g_pMsgListPrev = g_pMsgMovePtr;/*保存上次的消息*/ g_pMsgMovePtr->lpNext = pTmpMsgList;/*将新消息挂到消息列表*/ g_pMsgMovePtr = pTmpMsgList;/*将实时指针指向最后的消息*/ } ::PostMessage(g_Dlg_Hwnd,WM_PASSDATA,wParam,(LPARAM)pTmpMsgList); } return ::CallNextHookEx(g_hHookOperationsRecord,nCode,wParam,lParam); } LRESULT CALLBACK JournalPlaybackProc(int nCode,WPARAM wParam,LPARAM lParam) { if (nCode < 0) return ::CallNextHookEx(g_hHookOperationsDisplay,nCode,wParam,lParam); if (!g_pMsgMovePtr) { if (!g_pMsgListHeader) { return UnInstallOperationsDisplayHook(); } g_pMsgMovePtr = g_pMsgListHeader; g_pMsgListPrev = g_pMsgListHeader; } switch (nCode) { case HC_GETNEXT: /********************************************************************* *The hook procedure must copy the current mouse or keyboard message * *to the EVENTMSG structure pointed to by the lParam parameter. * *********************************************************************/ { LPEVENTMSG lpEvent = (LPEVENTMSG)lParam; if (g_pMsgMovePtr && g_pMsgListPrev && lpEvent) { lpEvent->message = g_pMsgListPrev->Event.message; lpEvent->paramL = g_pMsgListPrev->Event.paramL; lpEvent->paramH = g_pMsgListPrev->Event.paramH; lpEvent->time = g_pMsgListPrev->Event.time; lpEvent->hwnd = g_pMsgListPrev->Event.hwnd; RetTime = g_pMsgMovePtr->Event.time - g_pMsgListPrev->Event.time; if (g_pMsgMovePtr != g_pMsgListPrev) { g_pMsgListPrev = g_pMsgMovePtr; } } if (RetTime < 0) RetTime = 1; return RetTime; } case HC_SKIP: /***************************************************************************** *The hook procedure must prepare to copy the next mouse or keyboard message * *to the EVENTMSG structure pointed to by lParam. * *Upon receiving the HC_GETNEXT code, * *the hook procedure must copy the message to the structure. * *****************************************************************************/ { if (!g_pMsgMovePtr->lpNext) { return UnInstallOperationsDisplayHook(); } if (g_pMsgListPrev != g_pMsgMovePtr) g_pMsgListPrev = g_pMsgMovePtr; g_pMsgMovePtr = g_pMsgMovePtr->lpNext; return 0; } default: break; } return ::CallNextHookEx(g_hHookOperationsDisplay,nCode,wParam,lParam); } BOOL CheckOperationsRecordHookHandle() { return g_hHookOperationsRecord ? TRUE : FALSE; } BOOL CheckOperationsDisplayHookHandle() { return g_hHookOperationsDisplay ? TRUE : FALSE; } BOOL UnInstallOperationsHook() { if (!g_hHookOperationsRecord) return TRUE; BOOL IsUnInstallSuccess = ::UnhookWindowsHookEx(g_hHookOperationsRecord); g_hHookOperationsRecord = NULL; return IsUnInstallSuccess; } BOOL UnInstallOperationsDisplayHook() { if (!g_hHookOperationsDisplay) return TRUE; BOOL IsUnInstallSuccess = ::UnhookWindowsHookEx(g_hHookOperationsDisplay); g_hHookOperationsDisplay = NULL; return IsUnInstallSuccess; } LPCTSTR GetMsgName(UINT nCode) { for(int i=0,nCount=sizeof(messages)/sizeof(MsgStruct);i<nCount;++i) { if(messages[i].nCode == nCode) return messages[i].pszText; } return "Sorry,I Don't Know."; } void FreeMsgList() { delete g_pMsgListHeader; g_pMsgMovePtr = NULL; g_pMsgListHeader = NULL; g_pMsgListLast = NULL; g_pMsgListPrev = NULL; RetTime = 0; } /*****************HOOKService.cpp***********************/ /*****************stdafx.h***********************/ // stdafx.h : 标准系统包含文件的包含文件, // 或是经常使用但不常更改的 // 项目特定的包含文件 #pragma once #ifndef VC_EXTRALEAN #define VC_EXTRALEAN // 从 Windows 标头中排除不常使用的资料 #endif // 如果您必须使用下列所指定的平台之前的平台,则修改下面的定义。 // 有关不同平台的相应值的最新信息,请参考 MSDN。 #ifndef WINVER //允许使用 Windows 95 和 Windows NT 4 或更高版本的特定功能。 #define WINVER 0x0400 //为 Windows98 和 Windows 2000 及更新版本改变为适当的值。 #endif #ifndef _WIN32_WINNT // 允许使用 Windows NT 4 或更高版本的特定功能。 #define _WIN32_WINNT 0x0400 //为 Windows98 和 Windows 2000 及更新版本改变为适当的值。 #endif #ifndef _WIN32_WINDOWS // 允许使用 Windows 98 或更高版本的特定功能。 #define _WIN32_WINDOWS 0x0410 //为 Windows Me 及更新版本改变为适当的值。 #endif #ifndef _WIN32_IE //允许使用 IE 4.0 或更高版本的特定功能。 #define _WIN32_IE 0x0400 //为 IE 5.0 及更新版本改变为适当的值。 #endif #define _ATL_CSTRING_EXPLICIT_CONSTRUCTORS // 某些 CString 构造函数将是显式的 // 关闭 MFC 对某些常见但经常被安全忽略的警告消息的隐藏 #define _AFX_ALL_WARNINGS #include <afxwin.h> // MFC 核心和标准组件 #include <afxext.h> // MFC 扩展 #include <afxdisp.h> // MFC 自动化类 #include <afxdtctl.h> // Internet Explorer 4 公共控件的 MFC 支持 #ifndef _AFX_NO_AFXCMN_SUPPORT #include <afxcmn.h>// Windows 公共控件的 MFC 支持 #endif // _AFX_NO_AFXCMN_SUPPORT #define WM_PASSDATA WM_USER+1982 #include <vector> using namespace std; #include <windowsx.h> #include <winable.h> struct MsgStruct { UINT nCode; LPCTSTR pszText; }; struct MsgList { public: MsgList() { memset(&Event,0,sizeof(EVENTMSG)); lpNext = NULL; } ~MsgList() { if (lpNext && !::IsBadReadPtr(lpNext,sizeof(MsgList))) delete lpNext; memset(&Event,0,sizeof(EVENTMSG)); lpNext = NULL; } EVENTMSG Event; MsgList *lpNext; }; static HHOOK g_hHookOperationsRecord = NULL; static HHOOK g_hHookOperationsDisplay = NULL; static HINSTANCE g_AppInstance = NULL; static MsgList* g_pMsgMovePtr = NULL; static MsgList* g_pMsgListHeader = NULL; static MsgList* g_pMsgListLast = NULL; static MsgList* g_pMsgListPrev = NULL; static HWND g_Dlg_Hwnd = NULL; static DWORD RetTime = 0; static MsgStruct messages[] = { {WM_NULL,"WM_NULL"}, {WM_CREATE,"WM_CREATE"}, {WM_DESTROY,"WM_DESTROY"}, {WM_MOVE,"WM_MOVE"}, {WM_SIZE,"WM_SIZE"}, {WM_ACTIVATE,"WM_ACTIVATE"}, {WM_SETFOCUS,"WM_SETFOCUS"}, {WM_KILLFOCUS,"WM_KILLFOCUS"}, {WM_ENABLE,"WM_ENABLE"}, {WM_SETREDRAW,"WM_SETREDRAW"}, {WM_SETTEXT,"WM_SETTEXT"}, {WM_GETTEXT,"WM_GETTEXT"}, {WM_GETTEXTLENGTH,"WM_GETTEXTLENGTH"}, {WM_PAINT,"WM_PAINT"}, {WM_CLOSE,"WM_CLOSE"}, {WM_QUERYENDSESSION,"WM_QUERYENDSESSION"}, {WM_QUIT,"WM_QUIT"}, {WM_QUERYOPEN,"WM_QUERYOPEN"}, {WM_ERASEBKGND,"WM_ERASEBKGND"}, {0x0015,"WM_SYSCOLORCHANGE"}, {WM_ENDSESSION,"WM_ENDSESSION"}, {WM_SHOWWINDOW,"WM_SHOWWINDOW"}, {WM_WININICHANGE,"WM_WININICHANGE"}, {WM_DEVMODECHANGE,"WM_DEVMODECHANGE"}, {WM_ACTIVATEAPP,"WM_ACTIVATEAPP"}, {0x001D,"WM_FONTCHANGE"}, {WM_TIMECHANGE,"WM_TIMECHANGE"}, {WM_CANCELMODE,"WM_CANCELMODE"}, {WM_SETCURSOR,"WM_SETCURSOR"}, {WM_MOUSEACTIVATE,"WM_MOUSEACTIVATE"}, {WM_CHILDACTIVATE,"WM_CHILDACTIVATE"}, {WM_QUEUESYNC,"WM_QUEUESYNC"}, {WM_GETMINMAXINFO,"WM_GETMINMAXINFO"}, {WM_ICONERASEBKGND,"WM_ICONERASEBKGND"}, {WM_NEXTDLGCTL,"WM_NEXTDLGCTL"}, {WM_SPOOLERSTATUS,"WM_SPOOLERSTATUS"}, {WM_DRAWITEM,"WM_DRAWITEM"}, {WM_MEASUREITEM,"WM_MEASUREITEM"}, {WM_DELETEITEM,"WM_DELETEITEM"}, {WM_VKEYTOITEM,"WM_VKEYTOITEM"}, {WM_CHARTOITEM,"WM_CHARTOITEM"}, {WM_SETFONT,"WM_SETFONT"}, {WM_GETFONT,"WM_GETFONT"}, {WM_QUERYDRAGICON,"WM_QUERYDRAGICON"}, {WM_COMPAREITEM,"WM_COMPAREITEM"}, {WM_COMPACTING,"WM_COMPACTING"}, {0x0044,"WM_COMMNOTIFY"}, {WM_WINDOWPOSCHANGING,"WM_WINDOWPOSCHANGING"}, {WM_WINDOWPOSCHANGED,"WM_WINDOWPOSCHANGED"}, {WM_POWER, "WM_POWER"}, {WM_NCCREATE,"WM_NCCREATE"}, {WM_NCDESTROY,"WM_NCDESTROY"}, {WM_NCCALCSIZE,"WM_NCCALCSIZE"}, {WM_NCHITTEST,"WM_NCHITTEST"}, {WM_NCPAINT, "WM_NCPAINT"}, {WM_NCACTIVATE,"WM_NCACTIVATE"}, {WM_GETDLGCODE,"WM_GETDLGCODE"}, {WM_NCMOUSEMOVE,"WM_NCMOUSEMOVE"}, {WM_NCLBUTTONDOWN,"WM_NCLBUTTONDOWN"}, {WM_NCLBUTTONUP,"WM_NCLBUTTONUP"}, {WM_NCLBUTTONDBLCLK,"WM_NCLBUTTONDBLCLK"}, {WM_NCRBUTTONDOWN,"WM_NCRBUTTONDOWN"}, {WM_NCRBUTTONUP,"WM_NCRBUTTONUP"}, {WM_NCRBUTTONDBLCLK,"WM_NCRBUTTONDBLCLK"}, {WM_NCMBUTTONDOWN,"WM_NCMBUTTONDOWN"}, {WM_NCMBUTTONUP,"WM_NCMBUTTONUP"}, {WM_NCMBUTTONDBLCLK,"WM_NCMBUTTONDBLCLK"}, {WM_KEYDOWN,"WM_KEYDOWN"}, {WM_KEYUP, "WM_KEYUP"}, {WM_CHAR,"WM_CHAR"}, {WM_DEADCHAR,"WM_DEADCHAR"}, {WM_SYSKEYDOWN,"WM_SYSKEYDOWN"}, {WM_SYSKEYUP,"WM_SYSKEYUP"}, {WM_SYSCHAR,"WM_SYSCHAR"}, {WM_SYSDEADCHAR,"WM_SYSDEADCHAR"}, {WM_KEYLAST,"WM_KEYLAST"}, {WM_INITDIALOG,"WM_INITDIALOG"}, {WM_COMMAND,"WM_COMMAND"}, {WM_SYSCOMMAND,"WM_SYSCOMMAND"}, {WM_TIMER, "WM_TIMER"}, {0x0114,"WM_HSCROLL"}, {0x0115,"WM_VSCROLL"}, {WM_INITMENU,"WM_INITMENU"}, {WM_INITMENUPOPUP,"WM_INITMENUPOPUP"}, {WM_MENUSELECT,"WM_MENUSELECT"}, {WM_MENUCHAR,"WM_MENUCHAR"}, {WM_ENTERIDLE,"WM_ENTERIDLE"}, {WM_MOUSEMOVE,"WM_MOUSEMOVE"}, {WM_LBUTTONDOWN,"WM_LBUTTONDOWN"}, {WM_LBUTTONUP,"WM_LBUTTONUP"}, {WM_LBUTTONDBLCLK,"WM_LBUTTONDBLCLK"}, {WM_RBUTTONDOWN,"WM_RBUTTONDOWN"}, {WM_RBUTTONUP,"WM_RBUTTONUP"}, {WM_RBUTTONDBLCLK,"WM_RBUTTONDBLCLK"}, {WM_MBUTTONDOWN,"WM_MBUTTONDOWN"}, {WM_MBUTTONUP,"WM_MBUTTONUP"}, {WM_MBUTTONDBLCLK,"WM_MBUTTONDBLCLK"}, {WM_PARENTNOTIFY,"WM_PARENTNOTIFY"}, {WM_MDICREATE,"WM_MDICREATE"}, {WM_MDIDESTROY,"WM_MDIDESTROY"}, {WM_MDIACTIVATE,"WM_MDIACTIVATE"}, {WM_MDIRESTORE,"WM_MDIRESTORE"}, {WM_MDINEXT,"WM_MDINEXT"}, {WM_MDIMAXIMIZE,"WM_MDIMAXIMIZE"}, {WM_MDITILE,"WM_MDITILE"}, {WM_MDICASCADE,"WM_MDICASCADE"}, {WM_MDIICONARRANGE,"WM_MDIICONARRANGE"}, {WM_MDIGETACTIVE,"WM_MDIGETACTIVE"}, {WM_MDISETMENU,"WM_MDISETMENU"}, {WM_DROPFILES,"WM_DROPFILES"}, {WM_CUT,"WM_CUT"}, {WM_COPY,"WM_COPY"}, {WM_PASTE,"WM_PASTE"}, {WM_CLEAR,"WM_CLEAR"}, {WM_UNDO,"WM_UNDO"}, {WM_RENDERFORMAT,"WM_RENDERFORMAT"}, {WM_RENDERALLFORMATS,"WM_RENDERALLFORMATS"}, {WM_DESTROYCLIPBOARD,"WM_DESTROYCLIPBOARD"}, {WM_DRAWCLIPBOARD,"WM_DRAWCLIPBOARD"}, {WM_PAINTCLIPBOARD,"WM_PAINTCLIPBOARD"}, {WM_VSCROLLCLIPBOARD,"WM_VSCROLLCLIPBOARD"}, {WM_SIZECLIPBOARD,"WM_SIZECLIPBOARD"}, {WM_ASKCBFORMATNAME,"WM_ASKCBFORMATNAME"}, {WM_CHANGECBCHAIN,"WM_CHANGECBCHAIN"}, {WM_HSCROLLCLIPBOARD,"WM_HSCROLLCLIPBOARD"}, {0x030F,"WM_QUERYNEWPALETTE"}, {0x0310,"WM_PALETTEISCHANGING"}, {0x0311,"WM_PALETTECHANGED"}, {WM_PENWINFIRST,"WM_PENWINFIRST"}, {WM_PENWINLAST,"WM_PENWINLAST"} }; /*****************stdafx.h***********************/ /*****************MessageTipDlg.h***********************/ // MessageTipDlg.h : 头文件 // #pragma once #include "afxcmn.h" // CMessageTipDlg 对话框 class CMessageTipDlg : public CDialog { // 构造 public: CMessageTipDlg(CWnd* pParent = NULL); // 标准构造函数 // 对话框数据 enum { IDD = IDD_MESSAGETIP_DIALOG }; protected: virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV 支持 // 实现 protected: HICON m_hIcon;
// 生成的消息映射函数 virtual BOOL OnInitDialog(); afx_msg void OnPaint(); afx_msg HCURSOR OnQueryDragIcon(); DECLARE_MESSAGE_MAP() public: afx_msg void OnBnClickedButtonStart(); afx_msg void OnBnClickedButtonDisplay(); afx_msg void OnBnClickedButtonExit(); afx_msg void OnOK(); afx_msg void OnCancel(); afx_msg void OnClose(); afx_msg LRESULT OnPassData(WPARAM,LPARAM); private: void EnableDisplayFunction(BOOL = TRUE); void EnableStartRecordFunction(BOOL = TRUE); CListCtrl m_ListCtrl_MsgTip; CImageList m_ImageList; CFile m_FileOut; void InitListCtrl(); protected: virtual LRESULT WindowProc(UINT message, WPARAM wParam, LPARAM lParam); public: virtual BOOL PreTranslateMessage(MSG* pMsg); virtual BOOL DestroyWindow(); afx_msg void OnBnClickedButtonOpenrecord(); afx_msg void OnBnClickedButtonSaverecord(); }; /*****************MessageTipDlg.h***********************/ /*****************MessageTipDlg.cpp***********************/ // MessageTipDlg.cpp : 实现文件 // #include "stdafx.h" #include "MessageTip.h" #include "MessageTipDlg.h" #include "HOOKService.h" #include ".\messagetipdlg.h" #ifdef _DEBUG #define new DEBUG_NEW #endif // CMessageTipDlg 对话框
CMessageTipDlg::CMessageTipDlg(CWnd* pParent /*=NULL*/) : CDialog(CMessageTipDlg::IDD, pParent) { m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME); } void CMessageTipDlg::DoDataExchange(CDataExchange* pDX) { CDialog::DoDataExchange(pDX); DDX_Control(pDX, IDC_LIST_MSGTIP, m_ListCtrl_MsgTip); } BEGIN_MESSAGE_MAP(CMessageTipDlg, CDialog) ON_WM_PAINT() ON_WM_QUERYDRAGICON() //}}AFX_MSG_MAP ON_BN_CLICKED(ID_BUTTON_START, OnBnClickedButtonStart) ON_BN_CLICKED(ID_BUTTON_DISPLAY, OnBnClickedButtonDisplay) ON_BN_CLICKED(ID_BUTTON_EXIT, OnBnClickedButtonExit) ON_MESSAGE(WM_PASSDATA,OnPassData) // ON_WM_SIZE() ON_BN_CLICKED(ID_BUTTON_OPENRECORD, OnBnClickedButtonOpenrecord) ON_BN_CLICKED(ID_BUTTON_SAVERECORD, OnBnClickedButtonSaverecord) END_MESSAGE_MAP() // CMessageTipDlg 消息处理程序
BOOL CMessageTipDlg::OnInitDialog() { CDialog::OnInitDialog(); // 设置此对话框的图标。当应用程序主窗口不是对话框时,框架将自动 // 执行此操作 SetIcon(m_hIcon, TRUE); // 设置大图标 SetIcon(m_hIcon, TRUE); // 设置小图标 // TODO: 在此添加额外的初始化代码 EnableDisplayFunction(FALSE); m_ImageList.Create(16,16,ILC_COLOR32,1,1); // m_ImageList.Add(AfxGetApp()->LoadIcon(IDI_MSGNAME)); // m_ImageList.Add(AfxGetApp()->LoadIcon(IDI_MSGTIME)); // m_ImageList.Add(AfxGetApp()->LoadIcon(IDI_MSGPARAM)); m_ImageList.Add(m_hIcon); InitListCtrl(); return TRUE; // 除非设置了控件的焦点,否则返回 TRUE } // 如果向对话框添加最小化按钮,则需要下面的代码 // 来绘制该图标。对于使用文档/视图模型的 MFC 应用程序, // 这将由框架自动完成。 void CMessageTipDlg::OnPaint() { if (IsIconic()) { CPaintDC dc(this); // 用于绘制的设备上下文 SendMessage(WM_ICONERASEBKGND, reinterpret_cast<WPARAM>(dc.GetSafeHdc()), 0); // 使图标在工作矩形中居中 int cxIcon = GetSystemMetrics(SM_CXICON); int cyIcon = GetSystemMetrics(SM_CYICON); CRect rect; GetClientRect(&rect); int x = (rect.Width() - cxIcon + 1) / 2; int y = (rect.Height() - cyIcon + 1) / 2; // 绘制图标 dc.DrawIcon(x, y, m_hIcon); } else { CDialog::OnPaint(); } } //当用户拖动最小化窗口时系统调用此函数取得光标显示。 HCURSOR CMessageTipDlg::OnQueryDragIcon() { return static_cast<HCURSOR>(m_hIcon); } void CMessageTipDlg::OnBnClickedButtonStart() { // TODO: Add your control notification handler code here CFileDialog CommonFileDlg(FALSE,_T("hook"),_T("消息保存文件")); if (m_FileOut.m_hFile == INVALID_HANDLE_VALUE) { if (CommonFileDlg.DoModal() != IDOK) { AfxMessageBox("请选择消息保存位置^_^"); return ; } CFileFind FindFind; if (FindFind.FindFile((LPCTSTR)CommonFileDlg.GetPathName(),0)) m_FileOut.Open((LPCTSTR)CommonFileDlg.GetPathName(),CFile::modeReadWrite); else m_FileOut.Open((LPCTSTR)CommonFileDlg.GetPathName(),CFile::modeCreate|CFile::modeReadWrite); } else m_FileOut.SeekToBegin(); ULONGLONG ulFileLength = m_FileOut.GetLength(); if (ulFileLength > 0xffff) { m_FileOut.Close(); CString cstrNewFile(_T("")); cstrNewFile.Format("%s%I64d",CommonFileDlg.GetPathName(),rand() % ulFileLength); CFileFind FindFind; if (FindFind.FindFile((LPCTSTR)cstrNewFile,0)) m_FileOut.Open((LPCTSTR)cstrNewFile,CFile::modeReadWrite); else m_FileOut.Open((LPCTSTR)cstrNewFile,CFile::modeCreate|CFile::modeReadWrite); } if (!InstallOperationsHook(m_hWnd, AfxGetApp()->m_hInstance)) { AfxMessageBox("安装系统钩子失败!"); } EnableStartRecordFunction(FALSE); EnableDisplayFunction(); } void CMessageTipDlg::OnBnClickedButtonDisplay() { // TODO: Add your control notification handler code here if (!InstallOperationsDisplayHook(m_hWnd, AfxGetApp()->m_hInstance)) { AfxMessageBox("安装系统钩子失败!"); } EnableStartRecordFunction(); EnableDisplayFunction(FALSE); } void CMessageTipDlg::OnBnClickedButtonExit() { // TODO: Add your control notification handler code here FreeMsgList(); UnInstallOperationsHook(); UnInstallOperationsDisplayHook(); CDialog::OnOK(); } void CMessageTipDlg::OnOK() { return ; } void CMessageTipDlg::OnCancel() { return ; } void CMessageTipDlg::OnClose() { return ; } void CMessageTipDlg::EnableDisplayFunction(BOOL IsEnable/* = TRUE */) { ((CButton*)GetDlgItem(ID_BUTTON_DISPLAY))->EnableWindow(IsEnable); } void CMessageTipDlg::EnableStartRecordFunction(BOOL IsEnable/* = TRUE */) { ((CButton*)GetDlgItem(ID_BUTTON_START))->EnableWindow(IsEnable); } void CMessageTipDlg::InitListCtrl() { g_AppInstance = AfxGetApp()->m_hInstance;
m_ListCtrl_MsgTip.SetImageList(&m_ImageList,LVSIL_SMALL); LVCOLUMN col; col.mask = LVCF_FMT|LVCF_IMAGE|LVCF_SUBITEM|LVCF_TEXT|LVCF_WIDTH; col.fmt = LVCFMT_CENTER|LVCFMT_IMAGE; col.iImage = 0; col.cchTextMax = ::lstrlen("消息名称")+1; col.pszText = "消息名称"; col.iSubItem = 0; CRect rect(0,0,0,0); m_ListCtrl_MsgTip.GetWindowRect(&rect); col.cx = 120; m_ListCtrl_MsgTip.InsertColumn(0,&col); col.cx = 120; col.cchTextMax = ::lstrlen("消息值")+1; col.pszText = "消息值"; m_ListCtrl_MsgTip.InsertColumn(1,&col); col.cx = rect.Width(); col.cchTextMax = ::lstrlen("消息时间")+1; col.pszText = "消息时间"; m_ListCtrl_MsgTip.InsertColumn(2,&col); } LRESULT CMessageTipDlg::WindowProc(UINT message, WPARAM wParam, LPARAM lParam) { // TODO: Add your specialized code here and/or call the base class return CDialog::WindowProc(message, wParam, lParam); } BOOL CMessageTipDlg::PreTranslateMessage(MSG* pMsg) { // TODO: Add your specialized code here and/or call the base class return CDialog::PreTranslateMessage(pMsg); } LRESULT CMessageTipDlg::OnPassData(WPARAM wParam,LPARAM lParam) { LPEVENTMSG lpEventMsg = (LPEVENTMSG)lParam; CString cstrMsg(_T("")); TCHAR TargetWindowName[MAX_PATH] = { '\0' }; ::GetWindowText(::GetActiveWindow(),TargetWindowName,MAX_PATH); COleDateTime cdt(COleDateTime::GetCurrentTime()); CString cstrMsgName(GetMsgName(lpEventMsg->message)); cstrMsg.Format("消息名称:%s\r\n消息目标窗体:%s\r\n消息发送时间:%s\r\n---------------------------------------------\r\n", cstrMsgName,TargetWindowName, cdt.Format("%Y年%m月%d日%H时%M分%S秒")); m_FileOut.Write((LPCTSTR)cstrMsg,cstrMsg.GetLength()); m_ListCtrl_MsgTip.DeleteAllItems(); m_ListCtrl_MsgTip.InsertItem(0,(LPCTSTR)cstrMsgName,0); m_ListCtrl_MsgTip.SetItemText(0,1,(LPCTSTR)TargetWindowName); m_ListCtrl_MsgTip.SetItemText(0,2,(LPCTSTR)cdt.Format("%Y年%m月%d日%H时%M分%S秒")); return 0; } BOOL CMessageTipDlg::DestroyWindow() { // TODO: Add your specialized code here and/or call the base class if (m_FileOut.m_hFile != INVALID_HANDLE_VALUE) m_FileOut.Close(); return CDialog::DestroyWindow(); } void CMessageTipDlg::OnBnClickedButtonOpenrecord() { // TODO: Add your control notification handler code here } void CMessageTipDlg::OnBnClickedButtonSaverecord() { // TODO: Add your control notification handler code here }
/*****************MessageTipDlg.cpp***********************/ 
|