hook

//---------------------------------------------------------------------------    //挂上、卸下Keyboard hook,并运用自定义信息传递Hook数据    //---------------------------------------------------------------------------    #include <vcl.h> //原有BCB 头文件    #include <windows.h> //原有window 头文件    #pragma hdrstop    #pragma argsused    //自定义的键盘信息,与执行文件TKeyHookForm中自定义的键盘信息相互对应    const int WM_KEYHOOK = WM_USER+100;    //---------------------------------------------------------------------------    //DLL的固定声明    HHOOK hHook;//挂上的hook handle    HWND hAppWnd;//执行此dll的特定exe程序handle__"TKeyHookForm"    HINSTANCE inst;//连接文件的模块handle,固定行程    //---------------------------------------------------------------------------    //符合以C语言编译的DLL输出函数    extern "C" {           __declspec(dllexport) __stdcall void SetHook(void);           __declspec(dllexport) __stdcall void RemoveHook(void);           }    //---------------------------------------------------------------------------    //重载的KeyboardProc函数,持续送出键盘全域信息    LRESULT CALLBACK KeyboardProc(intWPARAMLPARAM);    //---------------------------------------------------------------------------    //DLL的构造函数与析构函数    int WINAPI DllEntryPoint(HINSTANCE hinst, unsigned long reason, void*)    {    inst = hinst;    //当此DLL被调用or结束    switch (reason)        {        case DLL_PROCESS_ATTACH ://此DLL构造函数             //取得执行此dll的特定程序handle             hAppWnd = ::FindWindow("TKeyHookForm", 0);             break;            case DLL_PROCESS_DETACH://此DLL析构函数             break;            case DLL_THREAD_ATTACH: //此DLL多线程构造函数             break;            case DLL_THREAD_DETACH: //此DLL多线程析构函数             break;      }    return 1;    }    //---------------------------------------------------------------------------    //注册自定义hook到hook链中    void __stdcall SetHook(void)    {//若Hook尚未挂上信息链中,则将本鼠标信息dll注册至hook链中    if(hHook == NULL)      {      hHook = ::SetWindowsHookEx(WH_KEYBOARD, (HOOKPROC)KeyboardProc, inst, 0);      //显示是否挂上hook,测试用!      if(hHook == NULL)          MessageBox(NULL, "Sorry! 无法挂上Hook。""Hook DLL", MB_OK);      else          ::TextOut(GetDC(0),10,10,"挂上Hook。",10);      }    }    //---------------------------------------------------------------------------    //在hook链中,解除自定义的hook    void __stdcall RemoveHook(void)    {//若Hook已经挂上信息链,则卸下此Hook信息    if(hHook != NULL)      {      if(::UnhookWindowsHookEx(hHook) != FALSE)        {        hHook = NULL;        ::TextOut(GetDC(0),50,10,"释放Hook。",10);        }      else //测试用!        MessageBox(NULL, "Sorry! 无法释放Hook。""Hook DLL", MB_OK);      }    else //测试用!      ::TextOut(GetDC(0),80,10,"Hook isn't NULL",16);    }    //---------------------------------------------------------------------------    //重载的KeyboardProc函数,持续送出键盘全域信息    LRESULT CALLBACK KeyboardProc(int nCode, WPARAM wParam, LPARAM lParam)    {    //若未挂上Hook链或键盘无信息输出,就交予下一hook链    if((nCode < 0) || nCode == HC_NOREMOVE)       return ::CallNextHookEx(hHook, nCode, wParam, lParam);    //若信息重复,则跳至下一hook链    if(lParam & 0x40000000)       return ::CallNextHookEx(hHook, nCode, wParam, lParam);    //若在DLL建构式中,取得执行此dll的特定程序handle,即送出自定义键盘信息    if(hAppWnd != NULL)      SendMessage(hAppWnd, WM_KEYHOOK, wParam, lParam);        return ::CallNextHookEx(hHook, nCode, wParam, lParam);    }    //---------------------------------------------------------------------------  
 




转载于:https://www.cnblogs.com/xe2011/archive/2012/07/16/594b34939916e070aad2e1e4d2ae8d04.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值