全局钩子例子

全局HOOK要做成DLL模块,被系统调用,从而实现全局监控。在DLL中要实现HOOK处理函数、 SetWindowsHookEx和UnhookWindowsHookEx函数。
一、VC建立DL:L工程。
二、添加自己的函数(监控某窗口的键盘消息,实现屏蔽系统键)
添加的全局键盘钩子代码:
//
HWND m_hLWnd=NULL;  //监视的窗口句柄
HWND m_hPWnd=NULL;  //处理该消息的窗口句柄
HHOOK g_hHookKbdLL;  //HOOK句柄
extern "C" _declspec(dllexport) LRESULT CALLBACK GlobalKeyHOOK(
                                      int nCode,      // hook code
                                      WPARAM wParam,  // message identifier
                                      LPARAM lParam   // mouse coordinates
)
{
    HWND hwnd=GetActiveWindow();
    if(hwnd==m_hLWnd)
    {
        KBDLLHOOKSTRUCT* pKBDLLHOOK=(KBDLLHOOKSTRUCT*)lParam;
        if(pKBDLLHOOK->flags&0x80)//按下
        {
            PostMessage (m_hPWnd, WM_KEYUP,pKBDLLHOOK->vkCode,0);
        }
        else//释放
        {
            PostMessage (m_hPWnd, WM_KEYDOWN,pKBDLLHOOK->vkCode,0);
        }

        return 1;
    }
    return 0;
}
extern "C" _declspec(dllexport) void SetHOOKWindow(HWND ListenHwnd,HWND ProHwnd)
{
    m_hLWnd=ListenHwnd;
    m_hPWnd=ProHwnd;
}
//
extern "C" _declspec(dllexport) void SetHOOK()
{
    g_hHookKbdLL = SetWindowsHookEx(WH_KEYBOARD_LL,GlobalKeyHOOK,
        (HINSTANCE__ *)m_hModule, 0);  //m_hModule是从模块入口函数DllMain()的模块句柄参数赋值而得
}
extern "C" _declspec(dllexport) void UnSetHOOK()
{
    if(g_hHookKbdLL)
    {
        UnhookWindowsHookEx(g_hHookKbdLL);
    }
}

三、调用
1、建立调用工程。
2、调用代码
//声明DLL中将要用到的函数的指针
void (*SetHook)(void);
void (*SetHOOKWindow)(HWND ListenHwnd,HWND ProHwnd);

//具体调用代码
HOOKPROC GlobalMouseProc;
HINSTANCE hinstDLL;
HHOOK MK_HOOK;
hinstDLL = LoadLibrary((LPCTSTR) "G://MyProgram//MKHooks//Debug//MKHooks.dll");
if(NULL==hinstDLL)AfxMessageBox("Load DLL ERROR");

SetHook=(void (__cdecl *)(void))GetProcAddress(hinstDLL, "SetHOOK");
SetHOOKWindow=(void (__cdecl *)(struct HWND__ *,struct HWND__ *))GetProcAddress(hinstDLL, "SetHOOKWindow");
SetHOOKWindow(this->m_hWnd,m_hProWnd);
SetHook();

(Windows  HOOK 函数查看MSDN)
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值