平台钩子使用

您所在的位置:网站首页 vb中keydown是什么意思 平台钩子使用

平台钩子使用

2023-04-12 16:44| 来源: 网络整理| 查看: 265

/********************************************************************/

/* 文件名: MaskKey.cpp                                              */

/*                                                                  */

/* 功能: 标准 DLL ---- 利用底层键盘钩子实现拦截键盘任意按键         */

/*                                                                  */

/* 作者: 卢培培 (goodname008)             时间: 2005.1.18           */

/*                                                                  */

/* BLOG: http://blog.csdn.net/goodname008                           */

/********************************************************************/

 

// 导出函数列表

// StartMaskKey

// StopMaskKey

 

#define _WIN32_WINNT  0x0500                   // 设置系统版本, 确保可以使用底层键盘钩子

 

#include "windows.h"

 

// 回调函数指针

typedef BOOL (CALLBACK* LPFNKEYBOARDPROC)(WPARAM, KBDLLHOOKSTRUCT*);

 

// 全局变量

LPDWORD       g_lpdwVirtualKey = NULL;         // Keycode 数组de指针

int           g_nLength = 0;                   // Keycode 数组de大小

BOOL          g_bDisableKeyboard = FALSE;      // 匙否屏蔽整个键盘

HINSTANCE     g_hInstance = NULL;              // 模块实例句柄

HHOOK         g_hHook = NULL;                  // 钩子句柄

LPFNKEYBOARDPROC   g_lpfnKeyboardProc;         // 键盘钩子回调函数指针

 

// DLL 入口函数

BOOL APIENTRY DllMain(HANDLE hModule, DWORD ul_reason_for_call, LPVOID lpReserved)

{

     // 保存模块实例句柄

     g_hInstance = (HINSTANCE)hModule;

    

     // 在进程结束或线程结束时卸载钩子

     switch (ul_reason_for_call)

     {

         case DLL_PROCESS_ATTACH:

              break;

         case DLL_THREAD_ATTACH:

              break;

         case DLL_PROCESS_DETACH:

 

         case DLL_THREAD_DETACH:

              free(g_lpdwVirtualKey);

              if (g_hHook != NULL) UnhookWindowsHookEx(g_hHook);

              break;

     }

    return TRUE;

}

 

// 底层键盘钩子函数

LRESULT CALLBACK LowLevelKeyboardProc(int nCode, WPARAM wParam, LPARAM lParam)

{

     // 拦截键盘de某些按键, 如果 g_bDisableKeyboard 为 TRUE 则拦截整个键盘按键

if (nCode >= HC_ACTION)

     {

         KBDLLHOOKSTRUCT* pStruct = (KBDLLHOOKSTRUCT*)lParam;

         if (g_bDisableKeyboard)

              if (g_lpfnKeyboardProc(wParam, pStruct))

   return CallNextHookEx(g_hHook, nCode, wParam, lParam);

              else

                   return true;

 

         LPDWORD tmpVirtualKey = g_lpdwVirtualKey;

         for (int i = 0; i < g_nLength; i++)

         {

              if (pStruct->vkCode == *tmpVirtualKey++)

                   if (g_lpfnKeyboardProc(wParam, pStruct))

   return CallNextHookEx(g_hHook, nCode, wParam, lParam);

                   else

                       return true;

         }

        

     }   

 

     // 调用系统中de下一个钩子

     return CallNextHookEx(g_hHook, nCode, wParam, lParam);

}

 

/********************************************************************/

/* 开始拦截键盘按键                                                 */

/*                                                                  */

/* 参数:                                                            */

/*            lpdwVirtualKey              Keycode 数组de指针        */

/*            nLength                     Keycode 数组de大小        */

/*            bDisableKeyboard            匙否拦截整个键盘          */

/*                                                                  */

/* 返回值:    TRUE 成功, FALSE 失败                                 */

/********************************************************************/

BOOL WINAPI StartMaskKey(LPDWORD lpdwVirtualKey, int nLength,

                             LPFNKEYBOARDPROC lpfnKeyboardProc, BOOL bDisableKeyboard = FALSE)

{

     // 如果已经安装键盘钩子则返回 FALSE

     if (g_hHook != NULL || nLength == 0) return FALSE;

    

     // 将用户传来de keycode 数组保存在全局变量中

     g_lpdwVirtualKey = (LPDWORD)malloc(sizeof(DWORD) * nLength);

     LPDWORD tmpVirtualKey = g_lpdwVirtualKey;

     for (int i = 0; i < nLength; i++)

     {

         *tmpVirtualKey++ = *lpdwVirtualKey++;

     }

     g_nLength = nLength;

     g_bDisableKeyboard = bDisableKeyboard;

     g_lpfnKeyboardProc = lpfnKeyboardProc;

    

     // 安装底层键盘钩子

     g_hHook = SetWindowsHookEx(WH_KEYBOARD_LL, LowLevelKeyboardProc, g_hInstance, NULL);

     if (g_hHook == NULL) return FALSE;

     return TRUE;

    

}

 

/********************************************************************/

/* 停止拦截键盘按键                                                 */

/*                                                                  */

/* 参数: (无)                                                       */

/*                                                                  */

/* 返回值:    TRUE 成功, FALSE 失败                                 */

/********************************************************************/

BOOL WINAPI StopMaskKey()

{

     // 卸载钩子

     if (UnhookWindowsHookEx(g_hHook) == 0) return FALSE;

     g_hHook = NULL;

     return TRUE;

}

 



【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3