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

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

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

2019-11-14 10:23:10
字體:
來源:轉載
供稿:網友

(注意:本章沒有用到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 函數,前者是普通的鉤子函數,而后者是一個低級的鉤子函數,這兩個函數的參數不同,所以要獲取的值也不同??!
 
摘自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鍵盤消息?。?!

 

                   //按下的

                   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);

}

 

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


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
91成品人片a无限观看| 国产精品普通话| 久久在精品线影院精品国产| 欧美激情视频在线观看| 亚洲男女自偷自拍图片另类| 91影视免费在线观看| 久久男人资源视频| 红桃av永久久久| 日韩在线视频线视频免费网站| 久久免费少妇高潮久久精品99| 欧美在线视频网站| 欧美日韩在线影院| 2018国产精品视频| 成人两性免费视频| 九九九热精品免费视频观看网站| 国产999精品久久久影片官网| 国产精品久久久久久亚洲调教| 久久久久久久久中文字幕| 久久av在线看| 日韩电影免费观看在线观看| 91免费看片网站| 5566日本婷婷色中文字幕97| 亚洲精品动漫100p| 日韩免费观看av| 亚洲在线一区二区| 久久精品国产91精品亚洲| 91沈先生作品| 久久亚洲私人国产精品va| 97在线观看免费| 亚洲天堂第一页| 亚洲一区二区福利| 国产精品美女在线观看| 91久久久久久久久久久久久| 久久久之久亚州精品露出| 欧美激情一二三| 国产精品对白刺激| www.美女亚洲精品| 一区二区av在线| 亚洲国产成人精品久久| 国产一区二区三区在线视频| 成人性生交大片免费观看嘿嘿视频| 中文字幕亚洲无线码在线一区| 亚洲欧美制服中文字幕| 欧美天天综合色影久久精品| 亚洲精品不卡在线| 亚洲成人1234| 亚洲国产日韩一区| 在线看日韩av| 国产精品视频自拍| 疯狂做受xxxx欧美肥白少妇| 日韩av在线天堂网| 国产丝袜高跟一区| 国产福利成人在线| 国产aⅴ夜夜欢一区二区三区| 欧美在线一级va免费观看| 国产精品久久久久久久久久久久久| 色无极亚洲影院| 91国产视频在线播放| 久久免费成人精品视频| 亚洲福利在线视频| 亚洲精品欧美一区二区三区| 国产精品国语对白| 久久人人97超碰精品888| 插插插亚洲综合网| 欧美激情视频三区| 狠狠干狠狠久久| 日韩成人在线免费观看| 亚洲精品aⅴ中文字幕乱码| 亚洲激情视频在线| 亚洲精品视频在线播放| 国产亚洲精品久久久| 久久香蕉精品香蕉| 日韩av电影在线免费播放| 色午夜这里只有精品| 欧美激情中文字幕乱码免费| 日韩精品在线视频| 91黑丝高跟在线| 伊人激情综合网| 久久久久久国产精品| 免费不卡在线观看av| 精品久久在线播放| 欧美与黑人午夜性猛交久久久| 欧美有码在线观看| 97超视频免费观看| 国产脚交av在线一区二区| 国产97色在线| 久久99精品视频一区97| 国产精品777| 亚洲国产一区二区三区在线观看| 国产精品久久久久久婷婷天堂| 午夜精品理论片| 91日韩在线视频| 久久亚洲精品国产亚洲老地址| 久久精品国产91精品亚洲| 亚洲人成电影网站色www| 亚洲国产精品人久久电影| 欧美福利小视频| 亚洲国产美女久久久久| 久久精品国产精品| 欧美激情图片区| 国产亚洲人成a一在线v站| 亚洲欧美在线第一页| 亚洲一区999| 亚洲区中文字幕| 国产精品夜间视频香蕉| 亚洲欧洲偷拍精品| 日韩大陆欧美高清视频区| 中文字幕日韩av| 色综合天天综合网国产成人网| 欧美精品video| 亚洲欧美在线第一页| 国产精品xxx视频| 色播久久人人爽人人爽人人片视av| 日韩视频欧美视频| 国产香蕉97碰碰久久人人| 国产剧情日韩欧美| 97香蕉超级碰碰久久免费的优势| 久久人人爽人人爽人人片av高请| 亚洲综合精品一区二区| 国产一区二区三区欧美| 国产成人一区二区三区电影| 成人疯狂猛交xxx| 国产精品日日做人人爱| 韩国日本不卡在线| 欧美激情免费视频| 韩国19禁主播vip福利视频| 欧美精品日韩三级| 欧美激情按摩在线| 色在人av网站天堂精品| 在线视频日韩精品| 91色在线观看| 精品美女永久免费视频| 欧美丝袜第一区| 亚洲精品视频网上网址在线观看| 国产午夜精品一区理论片飘花| 福利精品视频在线| 国产精品久在线观看| 日韩在线欧美在线| 2019最新中文字幕| 日韩av在线高清| 国产在线高清精品| 最近更新的2019中文字幕| 欧美中文字幕在线| 久久久国产精品x99av| 深夜精品寂寞黄网站在线观看| 亚洲黄色在线观看| 亚洲www在线观看| 日韩精品视频在线观看网址| 欧美激情欧美狂野欧美精品| 欧美电影免费观看电视剧大全| 中文字幕亚洲欧美日韩在线不卡| 欧美激情va永久在线播放| 国产精品一区久久久| 亚洲精品欧美一区二区三区| 国产999精品视频| 丝袜美腿亚洲一区二区| 亚洲欧美制服第一页| 亚洲欧美三级伦理| 91天堂在线观看| 久久久久久久香蕉网| 国产99视频在线观看| 午夜欧美不卡精品aaaaa| 国产精品女主播视频| 最近2019年好看中文字幕视频|