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

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

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

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

(注意:本章沒有用到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
超碰精品一区二区三区乱码| 亚洲免费影视第一页| 欧美极品少妇xxxxx| 中文字幕精品一区久久久久| 精品视频在线观看日韩| 亚洲天堂免费视频| 久久久成人的性感天堂| 精品中文字幕久久久久久| 精品欧美国产一区二区三区| 日韩av免费在线观看| 欧美日韩亚洲高清| 欲色天天网综合久久| 欧美黑人巨大精品一区二区| 91成人免费观看网站| 久久在精品线影院精品国产| 日韩中文字幕视频在线| 久久久久久噜噜噜久久久精品| 91国内揄拍国内精品对白| 96sao精品视频在线观看| 久久av红桃一区二区小说| 国产成人91久久精品| 国产成人免费av电影| 国产精品久久久久久久久久小说| 成人在线精品视频| 日韩中文字幕免费| 亚洲黄色在线观看| 欧美美最猛性xxxxxx| 欧美性xxxx极品hd欧美风情| 欧美大片欧美激情性色a∨久久| 中文字幕日韩欧美在线视频| 神马久久桃色视频| 日韩综合中文字幕| 欧美美最猛性xxxxxx| 日韩国产激情在线| 欧美在线激情视频| 第一福利永久视频精品| 国产视频精品在线| 国产精选久久久久久| xvideos亚洲人网站| 日本sm极度另类视频| 九九热r在线视频精品| 亚洲伊人第一页| 国产精品高潮视频| 亚洲乱码国产乱码精品精| 性亚洲最疯狂xxxx高清| 欧美精品一本久久男人的天堂| 久久久久亚洲精品成人网小说| 日韩av观看网址| 亚洲精品国偷自产在线99热| 亚洲精品永久免费| 久久精品国产一区二区三区| 国产91色在线| 国产一区二区日韩精品欧美精品| 国产综合在线视频| 在线精品国产成人综合| 亚洲成色999久久网站| 久久天天躁狠狠躁夜夜躁| 欧美大胆a视频| 亚洲国产第一页| 国产一区二区在线免费| 国产成人一区二区三区小说| 国内精品视频一区| 精品久久香蕉国产线看观看亚洲| 欧美日韩aaaa| 欧美午夜精品久久久久久人妖| 久久精品国产亚洲7777| 欧美在线日韩在线| 91成人国产在线观看| 国产一区私人高清影院| 中文日韩在线观看| 欧美一区三区三区高中清蜜桃| 欧美日韩国产精品一区二区不卡中文| 成人福利在线视频| 九九热这里只有精品免费看| 最好看的2019的中文字幕视频| 91成人天堂久久成人| 国产精品久久久久久久久久久久久| 91精品国产综合久久香蕉最新版| 国产精品美女呻吟| 亚洲欧美制服中文字幕| 国产91精品久久久久| 久久av中文字幕| www.亚洲免费视频| 日韩成人中文字幕在线观看| 午夜精品福利视频| 欧美日韩精品中文字幕| 欧美日韩加勒比精品一区| 成人网在线免费看| 国产主播在线一区| 91国内免费在线视频| 少妇激情综合网| 激情亚洲一区二区三区四区| 亚洲欧美制服丝袜| 91精品国产综合久久香蕉最新版| 国产精自产拍久久久久久| 国产精品青青在线观看爽香蕉| 91久久精品久久国产性色也91| 中文综合在线观看| 92福利视频午夜1000合集在线观看| 日韩精品有码在线观看| 亚洲综合视频1区| 九九热最新视频//这里只有精品| 国产精品中文字幕久久久| 精品无码久久久久久国产| 精品国产1区2区| 尤物99国产成人精品视频| 国产成人av在线| 性欧美在线看片a免费观看| 亚洲精品成人久久电影| 亚洲女人被黑人巨大进入al| 欧美高清在线播放| 久久av红桃一区二区小说| 日本一本a高清免费不卡| 亚洲精品黄网在线观看| 国产69精品久久久久9999| 欧美做爰性生交视频| 在线观看中文字幕亚洲| 久久亚洲欧美日韩精品专区| 亚洲国产精品视频在线观看| 久久久免费高清电视剧观看| 亚洲精品www久久久| 懂色aⅴ精品一区二区三区蜜月| 国模视频一区二区三区| 欧美日韩在线视频一区二区| 欧美裸体男粗大视频在线观看| 国产精品视频一区二区高潮| 日韩精品高清在线观看| 欧美老少做受xxxx高潮| 日韩精品视频在线播放| 亚洲福利视频在线| 日韩国产高清污视频在线观看| 亚洲精品国产精品久久清纯直播| 中文字幕日韩高清| 久久手机精品视频| 日韩精品日韩在线观看| 91九色精品视频| 国产在线98福利播放视频| 国产精品久久精品| 91亚洲午夜在线| 庆余年2免费日韩剧观看大牛| 国产精品国产亚洲伊人久久| 亚洲欧美激情一区| 粗暴蹂躏中文一区二区三区| 亚洲一级片在线看| 国产精品入口夜色视频大尺度| 欧美日韩亚洲天堂| 色综合色综合网色综合| 国产欧美精品va在线观看| 精品国产成人av| 51精品国产黑色丝袜高跟鞋| 在线播放日韩专区| 国产免费一区二区三区在线能观看| 欧美劲爆第一页| 国产香蕉一区二区三区在线视频| 91亚洲精品久久久久久久久久久久| 欧美成人在线网站| 欧美国产视频一区二区| 久久久久久有精品国产| 成人国产精品久久久| 欧美日本中文字幕| 狠狠做深爱婷婷久久综合一区| 97在线看免费观看视频在线观看| 国模精品视频一区二区| 久久久噜噜噜久噜久久|