网站导航免费论文 原创论文 论文搜索 原创论文 网学软件 学术大家 资料中心 会员中心 问题解答 原创论文 论文素材 设计下载 最新论文 下载排行 论文上传 在线投稿 联系我们
返回网学首页
网学联系
最新论文 推荐专题 热门论文 素材专题
当前位置: 网学 > 编程文档 > VC++ > 正文
全局钩子详解
来源:Http://myeducs.cn 联系QQ:点击这里给我发消息 作者: 用户投稿 来源: 网络 发布时间: 12/10/15
下载{$ArticleTitle}原创论文样式
>头文件
再定义#define KEYHOOKLIB_EXPORTS让包含"HookDll.h"的时候,我们使用的是导出宏,
#include "HookDll.h"
#pragma data_seg("YCIShared")
HWND g_hWndCaller = NULL; // 保存主窗口句柄
HHOOK g_hHook = NULL;   // 保存钩子句柄
HHOOK g_hMouseHook=NULL;
#pragma data_seg()
我们上面定义了共享的全局窗口句柄和全局的钩子标识,是为了所有应用程序都共享这三个变量.
下面是钩子函数的实现代码:
HMODULE WINAPI ModuleFromAddress(PVOID pv) //获得钩子函数的地址
{
MEMORY_BASIC_INFORMATION mbi;
if(::VirtualQuery(pv, &mbi, sizeof(mbi)) != 0)
{
   return (HMODULE)mbi.AllocationBase;
}
else
{
   return NULL;
}
}
LRESULT CALLBACK KeyHookProc(int nCode, WPARAM wParam, LPARAM lParam)// 键盘钩子函数消息过程
{
     if(nCode < 0 || nCode == HC_NOREMOVE)
return ::CallNextHookEx(g_hHook, nCode, wParam, lParam);

     if(lParam & 0x40000000) // 消息重复就交给下一个hook链
{
   return ::CallNextHookEx(g_hHook, nCode, wParam, lParam);
}

// 通知主窗口。wParam参数为虚拟键码, lParam参数包含了此键的信息
   ::PostMessage(g_hWndCaller, HM_KEY, wParam, lParam);   //发送自定义键盘消息
   return ::CallNextHookEx(g_hHook, nCode, wParam, lParam);
}
BOOL WINAPI SetKeyHook(BOOL bInstall, DWORD dwThreadId, HWND hWndCaller)// 安装、卸载钩子的函数
{
BOOL bOk;
g_hWndCaller = hWndCaller;

if(bInstall)
{
   g_hHook = ::SetWindowsHookEx(WH_KEYBOARD, KeyHookProc,
     ModuleFromAddress(KeyHookProc), dwThreadId);               //安装键盘钩子
   bOk = (g_hHook != NULL);
}
else
{
   bOk = ::UnhookWindowsHookEx(g_hHook);
   g_hHook = NULL;
}

return bOk;
}
LRESULT CALLBACK MouseProc(int nCode, WPARAM wParam, LPARAM lParam)//鼠标钩子处理过程
{
   if(nCode < 0 || nCode == HC_NOREMOVE)
   return ::CallNextHookEx(g_hMouseHook, nCode, wParam, lParam);
   ::PostMessage(g_hWndCaller, HM_MOUSE, wParam, lParam);//发送自定义鼠标消息
   return ::CallNextHookEx(g_hMouseHook, nCode, wParam, lParam);
}
BOOL WINAPI SetMouseHook(BOOL bInstall, DWORD dwThreadId, HWND hWndCaller)
{
BOOL bOk;
g_hWndCaller = hWndCaller;
if(bInstall)
{
   g_hMouseHook = ::SetWindowsHookEx(WH_MOUSE, MouseProc,
   ModuleFromAddress(MouseProc),dwThreadId);   //安装鼠标钩子
   bOk = (g_hMouseHook != NULL);
}
else
{
   bOk = ::UnhookWindowsHookEx(g_hMouseHook);
   g_hMouseHook = NULL;
}
return bOk;
}
最后再在工程目录下建一个HookDll.def模块定义文件.写上以下代码
LIBRARY HookDll
EXPORTS         //指明导出函数名称
   SetKeyHook
   SetMouseHook
SECTIONS       //指明共享字段
   YCIShared   Read Write Shared
用了模块定义文件时,在使用动态链接库的时间就可以直接用函数名调用函数了,否则将无法找到函数.其实用模块定义

  • 下一篇资讯: MFC常用字符串操作函数
  • 网学推荐

    免费论文

    原创论文

    浏览:
    设为首页 | 加入收藏 | 论文首页 | 论文专题 | 设计下载 | 网学软件 | 论文模板 | 论文资源 | 程序设计 | 关于网学 | 站内搜索 | 网学留言 | 友情链接 | 资料中心
    版权所有 QQ:3710167 邮箱:3710167@qq.com 网学网 [Myeducs.cn] 您电脑的分辨率是 像素
    Copyright 2008-2015 myeducs.Cn www.myeducs.Cn All Rights Reserved
    湘ICP备09003080号