久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 15452|回復(fù): 0
打印 上一主題 下一主題
收起左側(cè)

使用WH_KEYBOARD_LL 低級鍵盤鉤子屏蔽系統(tǒng)熱鍵

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:71922 發(fā)表于 2015-1-11 00:06 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
  VC中使用低級鉤子捕獲系統(tǒng)按鍵

在VC中捕按鍵可以在OnKeyDown 或 OnKeyUp 事件中進(jìn)行捕獲,不過這有很大的局限性,這里只能捕獲用戶按鍵。但在一些特殊的工程(項目)中往往需要捕獲某些系統(tǒng)按鍵以完成特殊的功能,我們就不得不選擇鉤子了,一般情況下大家都會選擇 WH_KEYBOARD 這個鉤子類型,但是在編寫過程會發(fā)現(xiàn)這個鉤子類型并不能捕獲所有的系統(tǒng)按鍵,怎么辦呢?那就得選擇 WH_KEYBOARD_LL (低級鍵盤鉤子)了,使用它可以捕獲全部的系統(tǒng)按鍵,一個不漏……
在使用低級鍵盤鉤子之前,先在 StdAfx.h 的第一行添加一條: #define _WIN32_WINNT 0x400               (這里假定你是用的 MFC 的 DLL),不然在編譯的時候會提示說 WH_KEYBOARD_LL 沒有定義。網(wǎng)上還有另一種方法:首先定義 #define WH_KEYBOARD_LL 13     ; 然后 Winuser.h 中定義的 tagKBDLLHOOKSTRUCT 代碼拷貝到工程中。
下面代碼用以捕獲系統(tǒng)按鍵:
/*
用戶模塊
return TRUE; --->丟棄該消息
*/
LRESULT CALLBACK Hotkey_Filter(int nCode, WPARAM wParam, LPARAM lParam)
{
           KBDLLHOOKSTRUCT *Key_Info = (KBDLLHOOKSTRUCT*)lParam;
            if (HC_ACTION == nCode)
            {
                        if (WM_KEYDOWN == wParam || WM_SYSKEYDOWN)  //如果按鍵為按下狀態(tài)
                        {
                                    if (Key_Info->vkCode == VK_LWIN || Key_Info->vkCode == VK_RWIN) //屏敝 WIN(左右) 鍵
                                    {
                                                return TRUE;
                                    }
                                    if (Key_Info->vkCode == 0x4D && ((GetKeyState(VK_LWIN) & 0x8000) ||
                                                                                                   (GetKeyState(VK_RWIN) & 0x8000))) //屏敝 WIN+D 組合鍵(左右)
                                    {
                                                return TRUE;
                                    }
                                    if (Key_Info->vkCode == 0x44 && ((GetKeyState(VK_LWIN) & 0x8000) ||
                                                                                                   (GetKeyState(VK_LWIN) & 0x8000)))  //屏敝 WIN+M 組合鍵(左右)
                                    {
                                                return TRUE;
                                    }
                                    if (Key_Info->vkCode == 0x1b && GetKeyState(VK_CONTROL) & 0x8000) //屏敝 CTRL + ESC 組合鍵
                                    {
                                                return TRUE;
                                    }
                                    if (Key_Info->vkCode == VK_TAB && Key_Info->flags & LLKHF_ALTDOWN) //屏敝 ATL + TAB 組合鍵
                                    {
                                                return TRUE;
                                    }
                                     if (Key_Info->vkCode == VK_ESCAPE && Key_Info->flags & LLKHF_ALTDOWN) //屏敝 ATL + ESC 組合鍵
                                    {
                                                return TRUE;
                                    }
                        }

            }
            return CallNextHookEx(h_HotKey, nCode, wParam, lParam); //回調(diào)
}
BOOL Hotkey_Install(DWORD ThreadID)
{
            h_HotKey = SetWindowsHookEx(WH_KEYBOARD_LL, (HOOKPROC)Hotkey_Filter, //安裝低級鍵盤鉤子
           GetModuleHandle("hotkey"), ThreadID);
            if (NULL == h_HotKey)
            {
                        MessageBox(NULL, "安裝鉤子出錯 !", "error", MB_ICONSTOP);
                        return FALSE;
            }
            return TRUE;
}
BOOL Hotkey_UnInstall()
{
            UnhookWindowsHookEx(h_HotKey); //卸載鉤子
            return TRUE;
}
  *** 注意***
此鉤子必須是系統(tǒng)級的鉤子,也就是說在安裝鉤子的時候,ThreadID 的值必須為0。
在這兒需要特別說明的是:if (WM_KEYDOWN == wParam || WM_SYSKEYDOWN) ,如果不加這句,按鍵信息會被響應(yīng)兩次(KeyUP & KeyDown),
開始我只寫了 if  (WM_KEYDOWN == wParam) ,在捕獲 ALT+TAB 時就一直出錯,找不到方向,后來才想到 ALT 鍵盤是系統(tǒng)鍵,所以必須得加上
WM_SYSKEYDOWN,這樣才能捕獲 ALT+TAB ! if (WM_KEYDOWN == wParam || WM_SYSKEYDOWN) 也可以寫成 if (WM_KEYDOWN == wParam || WM_SYSKEYDOWN  ==  wParam)
如果要想屏敝 CTRL+ALT+DEL 鍵的話,也可能用相當(dāng)?shù)姆椒ǎ〔贿^可以用一種更簡單的方法來屏敝 CTRL+ALT+DEL :屏敝這個組合鍵的其中任意一個
按鍵便可達(dá)到相同的效果。
分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 分享淘帖 頂 踩
回復(fù)

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規(guī)則

小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機教程網(wǎng)

快速回復(fù) 返回頂部 返回列表
主站蜘蛛池模板: 伊人网站| 免费黄色a视频 | 国产一级片在线观看视频 | 日韩av在线一区二区三区 | 一区二区三区日 | 午夜影院网站 | 成人免费一区二区 | 一区二区三区在线免费 | 91毛片在线看 | 久久久久久成人网 | 91国内外精品自在线播放 | 国产精品成人一区二区 | 九色91视频 | 欧美激情在线一区二区三区 | 97综合在线 | 日韩欧美专区 | 久久伊人一区 | 久久久久亚洲 | 久久99精品久久久久久国产越南 | 欧美视频精品 | 97精品久久 | 国产成人精品久久二区二区91 | 精品欧美一区二区三区精品久久 | 四虎影视免费观看 | 国产日韩av一区二区 | 国产精品久久久久aaaa | 欧美在线视频一区二区 | 水蜜桃久久夜色精品一区 | 亚洲成人av在线播放 | 亚洲先锋影音 | 欧美一级二级三级 | 久久精品国产亚洲夜色av网站 | 欧美日韩视频在线 | 大乳boobs巨大吃奶挤奶 | 亚洲一区二区三区四区五区中文 | 一区二区三区中文 | 毛片毛片毛片毛片 | 亚洲精品视频在线看 | 精品99爱视频在线观看 | 欧美日韩中文国产一区发布 | 一区二区三区四区av |