AutoCAD 3DMAX C语言 Pro/E UG JAVA编程 PHP编程 Maya动画 Matlab应用 Android
Photoshop Word Excel flash VB编程 VC编程 Coreldraw SolidWorks A Designer Unity3D
 首页 > VC编程

金山词霸抓词机理 -- HOOK消息功能的使用

51自学网 2015-08-30 http://www.wanshiok.com

 

  BOOL Cmousehook::stophook()

  //卸载钩子

  {

  BOOL bResult=FALSE;

  if(glhHook)

  {

   bResult= UnhookWindowsHookEx(glhHook);

   if(bResult)

  {

   glhPrevTarWnd=NULL;

   glhDisplayWnd=NULL;//清变量

   glhHook=NULL;

  }

  }

  return bResult;

  }

  (9)钩子函数的实现:

  LRESULT WINAPI MouseProc(int nCode,WPARAM wparam,LPARAM lparam)

  {

  LPMOUSEHOOKSTRUCT pMouseHook=(MOUSEHOOKSTRUCT FAR *) lparam;

   if (nCode>=0)

  {

  HWND glhTargetWnd=pMouseHook->hwnd;

  //取目标窗口句柄

   HWND ParentWnd=glhTargetWnd;

   while (ParentWnd !=NULL)

  {

   glhTargetWnd=ParentWnd;

   ParentWnd=GetParent(glhTargetWnd);

   //取应用程序主窗口句柄

  }

   if(glhTargetWnd!=glhPrevTarWnd)

  {

   char szCaption[100];

   GetWindowText(glhTargetWnd,szCaption,100);

   //取目标窗口标题

   if(IsWindow(glhDisplayWnd))

   SendMessage(glhDisplayWnd,WM_SETTEXT,0,(LPARAM)(LPCTSTR)szCaption);

   glhPrevTarWnd=glhTargetWnd;

   //保存目标窗口

  }

  }

   return CallNextHookEx(glhHook,nCode,wparam,lparam);

   //继续传递消息

  }

  (10)编译项目生成mousehook.dll。

  2.创建钩子可执行程序

  (1)用MFC的AppWizard(EXE)创建项目Mouse;

  (2)选择“基于对话应用”并按下“完成”键;

  (3)编辑对话框,删除其中原有的两个按钮,加入静态文本框和编辑框,用鼠标右键点击静态文本框,在弹出的菜单中选择“属性”,设置其标题为“鼠标所在的窗口标题”;

  (4)在Mouse.h中加入对Mousehook.h的包含语句#Include"../Mousehook/Mousehook.h";

  (5)在CMouseDlg.h的CMouseDlg类定义中添加私有数据成员:

  CMouseHook m_hook;//加入钩子类作为数据成员

  (6)修改CmouseDlg::OnInitDialog()函数:

  BOOL CMouseDlg::OnInitDialog()

  {

  CDialog::OnInitDialog();

  ASSERT((IDM_ABOUTBOX & 0xFFF0) == IDM_ABOUTBOX);

  ASSERT(IDM_ABOUTBOX < 0xF000);

  CMenu* pSysMenu = GetSystemMenu(FALSE);

  if (pSysMenu != NULL)

  {

   CString strAboutMenu;

   strAboutMenu.LoadString(IDS_ABOUTBOX);

   if (!strAboutMenu.IsEmpty())

  {

   pSysMenu->AppendMenu(MF_SEPARATOR);

   pSysMenu->AppendMenu(MF_STRING, IDM_ABOUTBOX, strAboutMenu);

  }

  }

  SetIcon(m_hIcon, TRUE);//Set big icon

  SetIcon(m_hIcon, FALSE);//Set small icon

  //TODO: Add extra initialization here

  CWnd * pwnd=GetDlgItem(IDC_EDIT1);

  //取得编辑框的类指针

  m_hook.starthook(pwnd->GetSafeHwnd());

  //取得编辑框的窗口句柄并安装钩子

  return TRUE;

  //return TRUE unless you set the focus to a control

  }

  (7)链接DLL库,即把../Mousehook/debug/Mousehook.lib加入到项目设置链接标签中;

  (8)编译项目生成可执行文件;

  (9)把Mousehook.DLL拷贝到../mouse/debug目录中;

  (10)先运行几个可执行程序,然后运行Mouse.exe程序,把鼠标在不同窗口中移动,在Mouse.exe程序窗口中的编辑框内将显示出鼠标所在的应用程序主窗口的标题。

 
 
说明
:本教程来源互联网或网友上传或出版商,仅为学习研究或媒体推广,wanshiok.com不保证资料的完整性。

上一篇:Windows平台下的多线程编程  下一篇:使用CRectTracker类进行对象动态定位(一)