MyException - 我的异常网
当前位置:我的异常网» VC/MFC » 请问关于钩子回放WH_JOURNALPLAYBACK

请问关于钩子回放WH_JOURNALPLAYBACK

www.MyException.Cn  网友分享于:2013-04-29  浏览:21次
请教关于钩子回放WH_JOURNALPLAYBACK
我用WH_JOURNALRECORD记录键盘操作,然后用WH_JOURNALPLAYBACK回放,但回放的时候所有的鼠标和键盘都被屏蔽,我想在回放过程中可以进行回放终止操作,请问各位专家有没有办法可以解决?

------解决方案--------------------
C/C++ code
/*****************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***********************/

文章评论

为啥Android手机总会越用越慢?
为啥Android手机总会越用越慢?
程序员应该关注的一些事儿
程序员应该关注的一些事儿
老程序员的下场
老程序员的下场
团队中“技术大拿”并非越多越好
团队中“技术大拿”并非越多越好
亲爱的项目经理,我恨你
亲爱的项目经理,我恨你
程序员周末都喜欢做什么?
程序员周末都喜欢做什么?
60个开发者不容错过的免费资源库
60个开发者不容错过的免费资源库
聊聊HTTPS和SSL/TLS协议
聊聊HTTPS和SSL/TLS协议
为什么程序员都是夜猫子
为什么程序员都是夜猫子
编程语言是女人
编程语言是女人
Web开发人员为什么越来越懒了?
Web开发人员为什么越来越懒了?
要嫁就嫁程序猿—钱多话少死的早
要嫁就嫁程序猿—钱多话少死的早
程序员都该阅读的书
程序员都该阅读的书
我的丈夫是个程序员
我的丈夫是个程序员
我跳槽是因为他们的显示器更大
我跳槽是因为他们的显示器更大
当下全球最炙手可热的八位少年创业者
当下全球最炙手可热的八位少年创业者
漫画:程序员的工作
漫画:程序员的工作
Java程序员必看电影
Java程序员必看电影
“肮脏的”IT工作排行榜
“肮脏的”IT工作排行榜
一个程序员的时间管理
一个程序员的时间管理
 程序员的样子
程序员的样子
看13位CEO、创始人和高管如何提高工作效率
看13位CEO、创始人和高管如何提高工作效率
10个帮程序员减压放松的网站
10个帮程序员减压放松的网站
科技史上最臭名昭著的13大罪犯
科技史上最臭名昭著的13大罪犯
Java 与 .NET 的平台发展之争
Java 与 .NET 的平台发展之争
“懒”出效率是程序员的美德
“懒”出效率是程序员的美德
程序员的鄙视链
程序员的鄙视链
十大编程算法助程序员走上高手之路
十大编程算法助程序员走上高手之路
鲜为人知的编程真相
鲜为人知的编程真相
总结2014中国互联网十大段子
总结2014中国互联网十大段子
写给自己也写给你 自己到底该何去何从
写给自己也写给你 自己到底该何去何从
旅行,写作,编程
旅行,写作,编程
老美怎么看待阿里赴美上市
老美怎么看待阿里赴美上市
程序员和编码员之间的区别
程序员和编码员之间的区别
如何成为一名黑客
如何成为一名黑客
程序员的一天:一寸光阴一寸金
程序员的一天:一寸光阴一寸金
10个调试和排错的小建议
10个调试和排错的小建议
中美印日四国程序员比较
中美印日四国程序员比较
那些争议最大的编程观点
那些争议最大的编程观点
程序员眼里IE浏览器是什么样的
程序员眼里IE浏览器是什么样的
初级 vs 高级开发者 哪个性价比更高?
初级 vs 高级开发者 哪个性价比更高?
程序猿的崛起——Growth Hacker
程序猿的崛起——Growth Hacker
程序员最害怕的5件事 你中招了吗?
程序员最害怕的5件事 你中招了吗?
程序员必看的十大电影
程序员必看的十大电影
Web开发者需具备的8个好习惯
Web开发者需具备的8个好习惯
软件开发程序错误异常ExceptionCopyright © 2009-2015 MyException 版权所有