设为首页 加入收藏

TOP

22.2.9 屏蔽键盘Power键
2013-10-07 13:12:21 来源: 作者: 【 】 浏览:57
Tags:22.2.9 屏蔽 键盘 Power

22.2.9  屏蔽键盘Power键

通过回调函数,可以屏蔽系统按键的处理。本节介绍通过底层键盘钩子的回调函数屏蔽POWER键的方法。键盘钩子是当有键盘事件发生时,系统会执行的操作,操作执行的内容可以定义在回调函数中。用户可以通过挂上相应的钩子自定义的操作。由于POWER键是底层键盘按键,因此需要使用底层键盘钩子回调函数。其原型为:

  1. LRESULT CALLBACK LowLevelKeyboardProc
    ( int nCode,  // 指定钩子处理代码  
  2. WPARAM wParam,  // 指定键盘消息的标识符  
  3. LPARAM lParam); // 指向KBDLLHOOKSTRUCT
    结构的指针,其中存储按下的按键的信息 

如果nCode参数为HC_ACTION,则在wParam和lParam参数中包含与键盘消息相关的信息。如果nCode小于0,则钩子处理函数必须通过CallNextHookEx()函数将消息传递给下一个钩子。wParam参数用于指定键盘消息的标识符,取值为WM_KEYDOWN、WM_KEYUP、WM_SYSKEYDOWN或WM_SYSKEYUP,分别表示按键按下、按键抬起、系统按键按下、系统按键抬起。如果按下的按键是要屏蔽的按键,则返回true,否则,返回CallNextHookEx()函数。代码如下:

  1. LRESULT CALLBACK LowLevelKeyboardProc(int nCode,
    WPARAM wParam, LPARAM lParam)  
  2. {// 底层键盘钩子回调函数  
  3.     if (nCode == HC_ACTION)                    
    // 禁用键盘的某个按键  
  4.     {  
  5.         KBDLLHOOKSTRUCT* pHookStruct = 
    (KBDLLHOOKSTRUCT*)lParam;  
  6.                                               
    // 取出钩子结构  
  7.         LPDWORD tmpVirKey = m_lpdwVirtualKey;  
    // 取出要屏蔽的键的列表指针  
  8.             for (int i = 0; i < m_nLength; i++)
    // 依次处理要屏蔽的按键  
  9.             {  
  10.             if (*m_lpdwContentKey++ == 1)  
  11.             {  
  12.                 DWORD dwAltKey = 32;  
  13.             if ((pHookStruct->vkCode == 
    *tmpVirKey++)&& (pHook Struct-)  
  14.             >flags == dwAltKey))return true;  
  15.             }  
  16.             if (pHookStruct->vkCode == 
    *tmpVirKey++) return true;  
  17.         }  
  18.     }  
  19.     return CallNextHookEx(m_hHook, nCode, wParam, lParam);  
  20.                                           
    // 传给系统中的下一个钩子  

上面的代码是底层键盘钩子的回调函数。判断按下的功能组合键和按键是否与禁用的按键相同,如果是要屏蔽的按键,则返回true,终止向下一个钩子函数传递,从而屏蔽到此按键的事件。如果不是要屏蔽的按键,则返回CallNextHookEx,将消息传递给下一个钩子。为了使得功能可以重复使用,因此,将此功能封装在DLL中,而需要屏蔽的程序只需要调用DLL即可。以下代码是屏蔽按键的处理过程。

  1. SHIELDKEYBORDSAMPLE_API bool StartShieldKey
    (LPDWORD lpdwVirtualKey,  
  2. LPDWORD lpdwContentKey, int nLength)         
    // 屏蔽按键处理  
  3. {  
  4.     if (m_hHook != NULL) return StopShieldKey(); 
    // 执行停止按键处理函数  
  5.     m_lpdwVirtualKey = (LPDWORD)malloc
    (sizeof(DWORD) * nLength);  
  6.     m_lpdwContentKey = (LPDWORD)malloc
    (sizeof(DWORD) * nLength);  
  7.      LPDWORD tmpVirKey = m_lpdwVirtualKey;  
    // 要屏蔽的底层键盘  
  8.     LPDWORD tmpConKey = m_lpdwContentKey;  
    // 要屏蔽的底层键盘组合键  
  9.      for (int i = 0; i < nLength; i++)  
  10.      {  
  11.             *tmpVirKey++ = *lpdwVirtualKey++;  
  12.         *tmpConKey++ = *lpdwContentKey++;  
  13.      }  
  14.      m_nLength = nLength;  
  15.      m_hHook = SetWindowsHookEx(WH_KEYBOARD_LL,
    LowLevelKeyboardProc,  
  16. m_hInstance, NULL);                          
    // 安装底层键盘钩子  
  17.      if (m_hHook == NULL) return false;  
  18.      return true;  
  19. }  
  20. SHIELDKEYBORDSAMPLE_API bool StopShieldKey()    // 卸载按键钩子  
  21. {  
  22.      if (UnhookWindowsHookEx(m_hHook) == 0) return false;  
  23.      m_hHook = NULL;  
  24.      return true;  

在上面代码中,StartShieldKey()函数用于安装钩子。首先将传入的要屏蔽的按键的数组传入DLL中,并保存为全局变量。然后调用SetWindowsHookEx()函数安装钩子,并指定钩子的回调函数为LowLevelKeyboardProc()。StopShieldKey()函数用于卸载钩子。调用UnhookWindowsHookEx()函数卸载指定的钩子。下面的代码就是在调用的程序中,调用函数安装屏蔽Power键的钩子。

  1. Void CDLLAppSampleDlg::OnButtonDisablePower()    
    // 屏蔽Power按键  
  2. {  
  3.     DWORD dwVerKey[] = {0x00000001};       
    // 定义按键集合  
  4.     DWORD dwConKey[] = {0};  
  5.         int nLength = sizeof(dwVerKey)
    / sizeof(DWORD); // 计算长度  
  6.         if (StartShieldKey(dwVerKey,
    dwConKey, nLength)) WriteLog("已经屏蔽  
  7.     Power键");  
  8.     else WriteLog("屏蔽Power键失败");  

因为POWER键的按键代码是1,因此将其传入DLL中的StartShieldKey()函数,屏蔽POWER按键。

】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
分享到: 
上一篇3.4.6 应用于桥接模式 下一篇22.3.3 MFC常规DLL的创建实例

评论

帐  号: 密码: (新用户注册)
验 证 码:
表  情:
内  容: