钩子,全局钩子

简单说一下钩子的做法,这里用截获拷屏键做例子。

这个是钩子的回调函数声明
LRESULT CALLBACK HookProcKeyboard(int nCode, WPARAM wParam, LPARAM lParam);

在初始化的时候下钩子
g_hHookKB = ::SetWindowsHookEx(WH_KEYBOARD, HookProcKeyboard, theDll.m_hInstance, 0);

退出的时候卸载钩子
::UnhookWindowsHookEx(g_hHookKB);

钩子回调函数
LRESULT CALLBACK HookProcKeyboard(int nCode, WPARAM wParam, LPARAM lParam)
{
    CString s;
    s.Format("%d-%d-%d", nCode, (DWORD)wParam, (DWORD)lParam);
    AfxMessageBox(s);

    if (nCode == HC_ACTION && wParam == VK_SNAPSHOT)
    {

        if (g_hHookKB != NULL && g_nNumOfNeedClear > 0)
        {
            ::OpenClipboard(NULL);
            ::EmptyClipboard();
            ::CloseClipboard();
        }
   
        return 0;
    }
    return ::CallNextHookEx(g_hHookKB, nCode, wParam, lParam);
}

Ok了,这就是个最简单的钩子。

那什么是钩子什么是全局钩子?普通钩子又叫线程钩子,只针对某一线程,而全局钩子针对整个系统,这个例子就是个全局钩子,不过还要加下面几句:
#pragma data_seg(".PrtSc")

HHOOK g_hHookKB = NULL;

#pragma data_seg()
#pragma comment(linker, "/SECTION:.PrtSc,RWS")

设置一个数据段PrtSc,把这个段设为共享的,g_hHookKB放在这个段里。

不放在这里,当你的程序处于前台时,钩子会起作用,不在前台就不起作用,而放在这里,无论在不在前台都会起作用。

还有一个问题,我运行两遍这个程序,当第二个钩子下了以后,我把第一个运行起来的程序关掉,这个时候无论是不是全局的,钩子都被卸载了,在第二个程序里就可以肆无忌惮了。

要想解决这个问题,我试了半天,只有一个办法,钩子退出的时候不卸载,这样只有当所有进程都退出后钩子才会被自动卸载,不知道这样会不会有内存泄露,谁有更好的方法请告诉我。
 
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值