hook-简要实现

hook一般建立在dll中。在dll中完成hook安装,卸载。

hook安装:

hhook = ::SetWindowsHookEx(WH_KEYBOARD, (HOOKPROC)beep, hInstance, 0);
其中
WH_KEYBOARD是hook要监控的类型,这儿是键盘消息。
(HOOKPROC)beep是截获消息后的处理函数
hInstance是要安装钩子的程序实例,如果某个程序是给自己安装钩子可以通过DllMain得到。
0指安装全局钩子,其它的还有线程钩子。只针对某个线程进行监控

 

hook卸载:

UnhookWindowsHookEx(hhook);

 

hook处理函数:

LRESULT beep(int nCode,WPARAM wParam,LPARAM lParam)
{
 MessageBeep(-1);
 return CallNextHookEx(hhook,nCode,wParam,lParam); //向下传递
}

 

 hook.h

#ifdef DLL_HOOK
#else
#define DLL_HOOK _declspec(dllimport)
#endif

DLL_HOOK BOOL dobeep();

DLL_HOOK BOOL undobeep();

hook.cpp

#i nclude "stdafx.h"
#i nclude "hook.h"

#define DLL_HOOK _declspec(dllexport)

HHOOK hhook;
HINSTANCE hInstance;

BOOL APIENTRY DllMain( HANDLE hModule,
                       DWORD  ul_reason_for_call,
                       LPVOID lpReserved
      )
{
 hInstance=(HINSTANCE)hModule;
    return TRUE;
}


LRESULT beep(int nCode,WPARAM wParam,LPARAM lParam)
{
 MessageBeep(-1);
 return CallNextHookEx(hhook,nCode,wParam,lParam);
}

BOOL dobeep()
{
 hhook = ::SetWindowsHookEx(WH_KEYBOARD, (HOOKPROC)beep, hInstance, 0);


 if(!hhook) return FALSE;
 return TRUE;
}

BOOL undobeep()
{
 return UnhookWindowsHookEx(hhook);
}

和普通的dll一样。只是多了一个安装、卸载的过程。

在一个程序中安装钩子

void CDlgTest::OnButton4()
{
 // TODO: Add your control notification handler code here
 if(dobeep()) AfxMessageBox("hook setup success.");
}

void CDlgTest::OnButton5()
{
 // TODO: Add your control notification handler code here
 if(undobeep()) AfxMessageBox("hook unsetup success.");
}

钩子安装后,按键会发出声音

 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值