亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 學院 > 開發設計 > 正文

淺談C++KeyboardProc|LowLevelKeyboardProc函數使用

2019-11-14 11:09:26
字體:
來源:轉載
供稿:網友

(注意:本章沒有用到DLL,而是直接鉤住當前程序?。?

首先列舉 一下WindowsHOOK基本的函數(主要關于鍵盤…):

HHOOK WINAPI SetWindowsHookEx(

  _In_ int       idHook,

 _In_ HOOKPROC  lpfn,

 _In_ HINSTANCE hMod,

  _In_ DWord    dwThreadId

);

LRESULT WINAPI CallNextHookEx(
  _In_opt_ HHOOK  hhk,
  _In_     int    nCode,
  _In_     WPARAM wParam,
  _In_     LPARAM lParam
);

BOOL WINAPI UnhookWindowsHookEx(

  _In_ HHOOKhhk

);

LRESULT CALLBACK KeyboardProc(

  _In_ int    code,

  _In_ WPARAMwParam,

  _In_ LPARAMlParam

);

LRESULT CALLBACK LowLevelKeyboardProc(
  _In_ int    nCode,
  _In_ WPARAM wParam,
  _In_ LPARAM lParam
);
注意 上面的 KeyboardProc 和 LowLevelKeyboardProc 函數,前者是普通的鉤子函數,而后者是一個低級的鉤子函數,這兩個函數的參數不同,所以要獲取的值也不同?。?pre> 
摘自MSDN:
KeyboardProc的函數參數(wparam和lparam)使用

wParam [in]

Type: WPARAM

The virtual-key code of the key thatgenerated the keystroke message.

lParam [in]

Type: LPARAM

The repeat count, scan code, extended-key flag, contextcode, previous key-state flag, and transition-state flag. For more informationabout thelParam parameter, seeKeystroke Message Flags. The following table describes the bits of this value.

由此可看出 ,wparam主要是鍵盤的虛擬鍵代碼lparam主要是:

The lParam parameter of a keystroke message containsadditional information about the keystroke that generated the message. Thisinformation includes therepeat count, the scan code, the extended-key flag, thecontext code, the previous key-state flag, and the transition-state flag.The following illustration shows the locations of these flags and values in thelParam parameter.

怎么說呢,這個參數其實主要看16-23位,剛好達到8位,也就是一個掃描碼

那么像這樣的參數給我們有什么用?。科鋵嵢绻?用過函數 GetKeyNameText

就知道了,他的第一個參數就是lparam,也就是KeyboardProc 第三個參數?。∈遣皇呛芮??就是用他來獲取到按下的鍵盤名,所以這個函數 可以和KeyboardProc 一起使用!

 

下面就介紹 LowLevelboardProc 函數,參數和KeyboardProc 一樣,但是參數所起的作用差距很大,可謂 失之毫厘,差之千里~~

當 SetWindowsHookEx() 參數idHOOK 為WH_KEYBORAD_LL時,這個函數的參數中的wparam 為 鍵盤消息,如WM_KEYDOMN… 那么lparam 就是一個 LPKBDLLHOOKSTRUCT結構體了!看這個結構體的名字就知道這是一個用于 低級鍵盤鉤子的,“LL”->”LowLevel“,呵呵~這個結構體中 包括了 虛擬鍵代碼 和 掃描碼!

如上所述,我們大概就知道LowLevelboardProc 和 KeyboardProc的差別了,

但別忘了還有那個 SetWindowsHookEx()函數,現在在回憶一下那個函數原型:

 HHOOK WINAPI SetWindowsHookEx(

  _In_ int       idHook,

  _In_ HOOKPROC  lpfn,

  _In_ HINSTANCE hMod,

  _In_ DWORD    dwThreadId

);

當IdHook為WH_KEYBOARD 時,lpfn為KeyboardProc(名字自定義),hMod為當前程序實例句柄,MFC 有多種方法獲取,如:AfxGetInstanceHandle()  

最后一個 dwThreadId為0?。≈劣跒槭裁?,我現在還不是很清楚,希望有大神解答…

所以,當idHook為WH_KEYBOARD_LL時,dwThreadid 必須為當前模塊的線程ID!

看下圖來對比下:

 

據此,我把主要代碼給出來

HHOOK hHook2;

LRESULT CALLBACK KeyBoradProc(intcode,WPARAMwp,LPARAMlp)

{

         if (code<0)

         {

                   return CallNextHookEx(hHook2,code,wp,lp);

         }

         WCHAR szkeyValue[20]={ 0 };

         //wsprintf(szkeyValue, L"%c", wp);  //虛擬鍵代碼

            //獲取按鍵的名稱          

         GetKeyNameText(lp,szkeyValue, 50);

         AfxGetMainWnd()->SetDlgItemText(IDC_EDIT1,szkeyValue);

         return CallNextHookEx(hHook2,code,wp,lp);

}

       //安裝鍵盤鉤子

         hHook2 = SetWindowsHookEx(WH_KEYBOARD,KeyBoradProc,AfxGetInstanceHandle(),GetCurrentThreadId());      //注意這里的線程ID為當前程序的線程ID!

      

         //卸載鉤子

UnhookWindowsHookEx(hHook2);

下面是關于低級鍵盤鉤子的代碼;

         //低級的鍵盤鉤子

         hHook= ::SetWindowsHookEx(WH_KEYBOARD_LL,myLowLevelKeyboardProc,AfxGetInstanceHandle(),0);//注意這里TID為 0

 

         //卸載低級鉤子

UnhookWindowsHookEx(hHook)

 

//低級鉤子函數處理過程

LRESULT CALLBACK LowLevelKeyboardProc(_In_int   code,_In_WPARAMwParam,_In_LPARAMlParam)

{

                   if (code < 0)

                   {

                            returnCallNextHookEx(hHook,code,wParam,lParam);

                   }

 

                  // 低級鍵盤鉤子時,wparam參數為 WM鍵盤消息!?。?/p>

 

                   //按下的

                   if (code ==HC_ACTION&&wParam==WM_KEYDOWN)

                   {

                            LPKBDLLHOOKSTRUCTpKbs = (LPKBDLLHOOKSTRUCT)lParam;

                            WCHARszlMsg[100] = { 0 };

                            wsprintf(szMsg,L"vkCode:%c-scanCode:%02X",pKbs->vkCode,pKbs->scanCode);

 

//ESC鍵掃描碼

                            if (pKbs->scanCode==0x01)

                            {                         

                                     returnTRUE;

                            }

                   }

                   return CallNextHookEx(hHook,code,wParam,lParam);

}

 

基本上注釋已經說明了,那么本文也就到此結束了…


上一篇:abp項目之旅

下一篇:1049. Counting Ones (30)

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
97成人精品视频在线观看| 日韩一区二区av| 福利一区福利二区微拍刺激| 中文字幕日韩在线视频| 一区二区福利视频| 国产69久久精品成人| 久久夜色精品国产欧美乱| 亚洲电影在线观看| 成人性生交xxxxx网站| 欧美电影免费观看高清完整| 91久久精品日日躁夜夜躁国产| 亚洲色图25p| 日本精品中文字幕| 精品久久久久久久久久久久久久| 丝袜情趣国产精品| 欧美综合一区第一页| 激情懂色av一区av二区av| 欧美国产精品va在线观看| 色婷婷成人综合| 成人福利在线观看| 欧美国产视频日韩| 欧美巨乳美女视频| 日韩成人高清在线| 欧美亚洲一区在线| 亚洲色无码播放| 中文字幕亚洲二区| 精品成人69xx.xyz| 欧美成人精品一区二区| 性欧美长视频免费观看不卡| 欧美成年人视频| 欧美激情精品久久久久久大尺度| 91av在线免费观看视频| 日韩av手机在线| 国产成人高清激情视频在线观看| 美女精品视频一区| 欧美亚洲午夜视频在线观看| 国产精品都在这里| 亚洲综合精品伊人久久| 日韩在线观看免费网站| 亚洲大胆人体视频| 亚洲成**性毛茸茸| 日韩国产欧美精品一区二区三区| 92裸体在线视频网站| 国产精品av在线| 亚洲精品自在久久| 国产日产久久高清欧美一区| 国产美女精品视频免费观看| 亚洲美女av电影| 国产精品jvid在线观看蜜臀| 日韩精品久久久久久福利| 久色乳综合思思在线视频| 国产精品视频一区国模私拍| 国产成人免费av电影| 亚洲精品乱码久久久久久按摩观| 久久精品国产v日韩v亚洲| 欧美日韩人人澡狠狠躁视频| 亚洲欧美在线第一页| 亚洲国产美女久久久久| 国产精品视频一区二区三区四| 精品国产欧美一区二区三区成人| 精品久久在线播放| 97视频在线观看播放| 亚洲四色影视在线观看| 欧美三级xxx| 国内精品久久久久影院 日本资源| 欧美中文在线观看| 欧美与黑人午夜性猛交久久久| 伊人伊成久久人综合网站| 久久久久久久国产精品视频| 亚洲色无码播放| 欧美黄色片在线观看| 日韩经典中文字幕在线观看| 国产精品美女久久久久av超清| 久久国产天堂福利天堂| 日韩大胆人体377p| 91精品国产高清自在线| 欧美激情日韩图片| 亚洲国产精品热久久| 在线观看日韩www视频免费| 国产一区二区三区毛片| 九九久久综合网站| 一本一本久久a久久精品牛牛影视| 欧美国产日韩中文字幕在线| 国产精品成人品| 亚洲一区二区三区视频| 久久免费少妇高潮久久精品99| 国产精品欧美日韩一区二区| 91精品国产99久久久久久| 国产又爽又黄的激情精品视频| 亚洲一区精品电影| 国产精品久久久久999| 久久精品视频在线观看| 毛片精品免费在线观看| 日韩视频免费大全中文字幕| 日韩美女激情视频| 亚洲视频在线观看免费| 久久久人成影片一区二区三区| 国产精品久久久久av免费| 亚洲天堂av图片| 中文字幕精品www乱入免费视频| 一区二区在线视频| 91久久精品一区| 亚洲国产三级网| 国产日韩精品综合网站| 国产精品 欧美在线| 日本午夜人人精品| 亚洲激情视频网| 欧美一级电影久久| 中文日韩电影网站| 91视频88av| 精品福利视频导航| 欧美国产日韩一区二区| 久久久伊人日本| 久久噜噜噜精品国产亚洲综合| 精品国产91乱高清在线观看| 亚洲最大福利视频网站| 久久99精品国产99久久6尤物| 日韩欧美a级成人黄色| 国产在线观看精品| 538国产精品一区二区免费视频| 久久99热这里只有精品国产| 成人免费视频网址| 国产成人精品电影久久久| 91精品久久久久久久久久入口| 欧美尤物巨大精品爽| 亚洲国产欧美一区二区丝袜黑人| 国产精品99久久久久久白浆小说| 性欧美长视频免费观看不卡| 国产成人精品免费久久久久| 国产主播精品在线| 国产精自产拍久久久久久蜜| 午夜精品福利在线观看| 成人乱人伦精品视频在线观看| 91产国在线观看动作片喷水| 精品高清一区二区三区| 国产日韩精品一区二区| 久久久久久久999精品视频| 久久视频在线播放| 精品欧美一区二区三区| 成人免费淫片aa视频免费| 亚洲综合中文字幕68页| 色久欧美在线视频观看| 在线性视频日韩欧美| 欧美性猛xxx| 国内精品视频久久| 91精品国产色综合久久不卡98口| 国产精品久久国产精品99gif| 中文字幕久久精品| 欧美极品欧美精品欧美视频| 北条麻妃在线一区二区| 97精品伊人久久久大香线蕉| 中文字幕精品www乱入免费视频| 亚洲成年人影院在线| 亚洲一级免费视频| 九九视频直播综合网| 欧美有码在线观看视频| 成人午夜小视频| 91在线免费网站| 激情懂色av一区av二区av| 欧美成人黑人xx视频免费观看| 亚洲美女在线观看| 78m国产成人精品视频| 蜜臀久久99精品久久久无需会员| 欧美日韩一区二区在线|