WH_JOURNALRECORD與WH_JOURNALPLAYBACK應用(記錄和回放)

/*****************HOOKService.h***********************/BOOL InstallOperationsHook(HWND,HINSTANCE);BOOL InstallOperationsDisplayHook(HWND,HINSTANCE);BOOL UnInstallOperationsHook();BOOL UnInstallOpe...

/*****************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

{

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 // MFC 核心和標準組件

#include // MFC 擴展

#include // MFC 自動化類

#include // Internet Explorer 4 公共控件的 MFC 支持

#ifndef _AFX_NO_AFXCMN_SUPPORT

#include // Windows 公共控件的 MFC 支持

#endif // _AFX_NO_AFXCMN_SUPPORT

#define WM_PASSDATA WM_USER+1982

#include

using namespace std;

#include

#include

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(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(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***********************/

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章