0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

英創(chuàng)信息技術(shù)WinCE系統(tǒng)鼠標(biāo)鍵盤鉤子使用方法簡介

英創(chuàng)信息技術(shù) ? 來源:英創(chuàng)信息技術(shù) ? 作者:英創(chuàng)信息技術(shù) ? 2020-02-05 11:27 ? 次閱讀

在實際應(yīng)用中,有時程序需要在特定的鼠標(biāo)、按鍵事件后,執(zhí)行一些操作,比如:

1、點擊觸摸屏?xí)r觸發(fā)蜂鳴器。

2、在休眠狀態(tài)點擊觸摸屏后,讓程序結(jié)束休眠狀態(tài)。

3、設(shè)定全局的按鍵功能,如一鍵截圖或一鍵關(guān)機。

4、過濾一些鼠標(biāo)或鍵盤操作等等。

這時,可以使用鍵盤鼠標(biāo)鉤子來實現(xiàn)這些功能。

鉤子是WINDOWS/WINCE系統(tǒng)獨有的消息處理機制。通過系統(tǒng)調(diào)用,將消息處理程序段掛入系統(tǒng),獲得消息處理優(yōu)先控制權(quán),在消息達到目的窗口前進行處理。鉤子函數(shù)可以通過判斷決定是否加工處理(改變)消息,或不做處理繼續(xù)傳遞各消息,或強制結(jié)束消息傳遞。

鉤子有很多種,WINCE系統(tǒng)已精簡到只有4種鉤子。同時鉤子又可做局部鉤子或全局鉤子,局部鉤子僅在指定進程內(nèi)生效,而全局鉤子在系統(tǒng)范圍內(nèi)都生效。一般的全局鉤子需要掛載到dll中使用,本文介紹的鼠標(biāo)鉤子和鍵盤鉤子較特殊,不需要掛載到dll中即可全局生效。

鉤子的運行邏輯如下圖,每種鉤子可以掛入任意多個鉤子函數(shù),以鏈表方式存儲。系統(tǒng)優(yōu)先訪問鏈表首位的鉤子,然后依次傳遞消息給后面的鉤子處理。后掛入的鉤子位于鏈表的前端。

使用方法

添加鉤子分3步。

1、編寫鉤子函數(shù)處理代碼

2、調(diào)用API函數(shù)將鉤子函數(shù)掛入系統(tǒng)

3、創(chuàng)建消息循環(huán),使鉤子運作起來

添加引用

使用鉤子需要用到函數(shù),SetWindowsHookEx,UnhookWindowsHookEx,CallNextHookEx。及鍵盤鉤子鼠標(biāo)鉤子的定義,及鍵盤消息,鼠標(biāo)消息的結(jié)構(gòu)體定義,均定義在pwinuser.h中。

#include "pwinuser.h"

創(chuàng)建需要掛入系統(tǒng)的消息處理函數(shù)

即鉤子函數(shù),鉤子函數(shù)定義必須為制定的格式。

鉤子函數(shù)根據(jù)實際應(yīng)用需求,決定是否調(diào)用CallNextHookEx,將消息傳遞給后面的鉤子處理。

首位的鉤子函數(shù)返回值決定該消息是丟棄,還是傳給系統(tǒng)消息處理函數(shù),再分發(fā)給各窗口。

以下為鍵盤及鼠標(biāo)鉤子函數(shù)的示例。

鍵盤鉤子函數(shù)

該鍵盤鉤子示例函數(shù)中,當(dāng)檢測到按鍵‘1’按下時,調(diào)用Beep函數(shù)觸發(fā)蜂鳴器。

LRESULT CALLBACK KeyboardProc(intnCode,WPARAM wParam,LPARAM lParam)

{

KBDLLHOOKSTRUCT *pkbhs = (KBDLLHOOKSTRUCT *) lParam;

if(wParam == WM_KEYDOWN) //按鈕按下

{

switch(pkbhs->vkCode)

{

case0x31: //按鈕‘’

Beep();

break;

defaut:

break;

}

}

returnCallNextHookEx(NULL,nCode,wParam,lParam);

}

注:

1、WINCE鍵盤鉤子函數(shù)得到的WPARAM記錄的消息類別,如按鍵是按下消息WM_KEYDOWN還是彈起消息WM_KEYUP。

LPARAM指向鍵盤消息結(jié)構(gòu)體KBDLLHOOKSTRUCT,里面記錄有詳細信息,如觸發(fā)的按鍵是什么,有沒有輔助按下ALT鍵或者CTRL鍵,等等。

2、鉤子隊列第一個鉤子的返回值決定系統(tǒng)是否能接受到該消息。

返回0表示,將消息傳遞給系統(tǒng)消息處理函數(shù)繼續(xù)處理。

返回1表示,丟棄消息,系統(tǒng)將收不到該消息。

調(diào)用CallNextHookEx表示調(diào)用下一個鉤子消息處理函數(shù),如果不調(diào)用,那么后面的鉤子函數(shù)將不產(chǎn)生作用。

鼠標(biāo)(觸摸屏)鉤子函數(shù)

該鼠標(biāo)鉤子示例函數(shù)中,當(dāng)檢測到鼠標(biāo)或觸摸屏點擊時,調(diào)用Beep函數(shù)觸發(fā)蜂鳴器。

LRESULT CALLBACK MouseHookProc(intnCode, WPARAM wParam, LPARAM lParam)

{

MSLLHOOKSTRUCT *pmshs = (MSLLHOOKSTRUCT *) lParam;

if(wParam == WM_LBUTTONDOWN) //鼠標(biāo)點擊處理代碼

{

Beep();

}

returnCallNextHookEx(NULL,nCode,wParam,lParam);

}

注:

1、WINCE鼠標(biāo)鉤子函數(shù)得到的WPARAM記錄的消息類別,如是鼠標(biāo)按下還是彈起,還是雙擊,移動,等等。

LPARAM記錄的詳細信息,如點擊坐標(biāo),滾輪參數(shù)等等。

2、觸摸屏消息和鼠標(biāo)消息是一樣的。

3、鉤子隊列第一個鉤子的返回值決定系統(tǒng)是否能接受到該消息。

返回0表示,將消息傳遞給系統(tǒng)消息處理函數(shù)繼續(xù)處理。

返回1表示,丟棄消息,系統(tǒng)將收不到該消息。

調(diào)用CallNextHookEx表示調(diào)用下一個鉤子消息處理函數(shù),如果不調(diào)用,那么后面的鉤子函數(shù)將不產(chǎn)生作用。

Beep函數(shù)

在本文示例中,將嵌入式板子GPIO15連接上一個蜂鳴器,通過設(shè)置GPIO電平觸發(fā)蜂鳴器。

在程序初始段打開GPIO,獲得GPIO句柄。

#include"isa_dio.h"

HANDLE hGpio;

hGpio = OpenGPIO( _T("PIO1:"));

添加Beep函數(shù),通過GPIO句柄操作GPIO15。

voidBeep()

{

GPIO_OutClear(hGpio, GPIO15);

Sleep(10);

GPIO_OutSet(hGpio, GPIO15);

}

添加鉤子

在主線程中調(diào)用SetWindowsHookEx函數(shù)向系統(tǒng)添加鉤子。

第一個參數(shù)為添加的鉤子類型,WH_KEYBOARD_LL為鍵盤鉤子,WH_MOUSE_LL為鼠標(biāo)鉤子。

第二個參數(shù)為注入的消息處理函數(shù)指針,即前面定義的鉤子函數(shù)。

第三個參數(shù)為鉤子程序的instance指針,本文介紹的鉤子并不需要掛載到dll中使用,所以簡單設(shè)置為NULL即可。

最后個參數(shù)為鉤子關(guān)聯(lián)的線程句柄,這里為0表示關(guān)聯(lián)所有線程,即全局鉤子。

函數(shù)返回NULL表示添加鉤子失敗,成功返回鉤子句柄。

示例代碼如下:

HINSTANCE hInstance = NULL;

HHOOK g_hKBDhook = NULL;

HHOOK g_hMouseHook = NULL;

g_hKBDhook = SetWindowsHookEx(WH_KEYBOARD_LL, KeyboardProc, hInstance, 0);

if(g_hKBDhook == NULL)

{

returnfalse;

}

g_hMouseHook = SetWindowsHookEx(WH_MOUSE_LL, MouseHookProc, hInstance, 0);

if(g_hMouseHook == NULL)

{

returnfalse;

}

添加消息循環(huán)

鉤子機制是基于消息循環(huán)的,所以添加消息循環(huán)是必須的,如果沒有添加消息循環(huán),會導(dǎo)致系統(tǒng)消息進入鉤子后卡死。

MFC框架的程序已經(jīng)自帶消息循環(huán)。

而命令行的程序則需要在主函數(shù)里添加以下代碼。

MSG msg;

while(GetMessage(&msg, NULL, 0, 0)) {

TranslateMessage(&msg);

DispatchMessage(&msg);

}

刪除鉤子

當(dāng)不需要鉤子時,應(yīng)當(dāng)主動釋放鉤子。

UnhookWindowsHookEx(g_ hKBDhook);

UnhookWindowsHookEx(g_hMouseHook);

英創(chuàng)提供了例程及源代碼,有需要的客戶可以聯(lián)系英創(chuàng)工程師獲得。

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報投訴
  • WINDOWS
    +關(guān)注

    關(guān)注

    3

    文章

    3510

    瀏覽量

    88230
  • 嵌入式主板
    +關(guān)注

    關(guān)注

    7

    文章

    6083

    瀏覽量

    35115
收藏 人收藏

    評論

    相關(guān)推薦

    RTOS中鉤子函數(shù)的用途及用法

    在很多操作系統(tǒng)中,都存在這樣一類API函數(shù)接口:HOOK函數(shù)(也叫鉤子函數(shù))。
    的頭像 發(fā)表于 10-23 16:25 ?104次閱讀
    RTOS中<b class='flag-5'>鉤子</b>函數(shù)的用途及用法

    kvm切換器鼠標(biāo)鍵盤怎么設(shè)置

    KVM切換器(Keyboard, Video, Mouse switch)是一種硬件設(shè)備,允許用戶通過一套鍵盤、鼠標(biāo)和顯示器來控制多臺計算機。這種設(shè)備對于需要管理多臺服務(wù)器或計算機的用戶來說非常
    的頭像 發(fā)表于 10-17 09:38 ?171次閱讀

    梯度科技入選2023年信息技術(shù)應(yīng)用創(chuàng)新解決方案名單

    日前,工業(yè)和信息化部網(wǎng)絡(luò)安全產(chǎn)業(yè)發(fā)展中心(工業(yè)和信息化部信息中心)在天津舉辦2024信息技術(shù)應(yīng)用創(chuàng)新發(fā)展大會暨解決方案應(yīng)用推廣大會。會上正式公布了2023年
    的頭像 發(fā)表于 09-09 16:29 ?332次閱讀

    MSP430 FRAM技術(shù)使用方法和最佳實踐

    電子發(fā)燒友網(wǎng)站提供《MSP430 FRAM技術(shù)使用方法和最佳實踐.pdf》資料免費下載
    發(fā)表于 08-23 09:23 ?0次下載
    MSP430 FRAM<b class='flag-5'>技術(shù)</b>–<b class='flag-5'>使用方法</b>和最佳實踐

    如何實現(xiàn)iPad在充電的同時還能使用鍵盤鼠標(biāo) | LDR6020

    了使用的便捷性和效率。 iPad鍵鼠同時充電OTG技術(shù)原理: 設(shè)備連接 通過Type-C接口,iPad可以同時連接外接的鍵盤鼠標(biāo)。此時,iPad作為主機設(shè)備,負責(zé)管理和控制連接的設(shè)備。 OTG角色切換 由于OTG
    的頭像 發(fā)表于 06-15 18:12 ?608次閱讀
    如何實現(xiàn)iPad在充電的同時還能使用<b class='flag-5'>鍵盤</b>和<b class='flag-5'>鼠標(biāo)</b> | LDR6020

    esp-idf傳遞鼠標(biāo)數(shù)據(jù)延遲很大的原因?

    請假一下,用espidf通過wifi傳遞鼠標(biāo)鍵盤時間,延遲很大,可能是哪地方的問題呢?采用select機制,鼠標(biāo)數(shù)據(jù)通過uart回來,然后通過Wi-Fi傳遞給對方,socket已設(shè)置no_delay。發(fā)現(xiàn)用ardunio做的話延遲還小一些。對這種數(shù)據(jù)量小但延遲要求比較高的
    發(fā)表于 06-14 06:19

    USB口接鼠標(biāo)鍵盤可用,接U盤不能正常使用

    現(xiàn)自制飛凌A40i核心板底板,通過USB2514芯片將其中一路USB擴展4路,就是USB hub的形式,這4路USB接鼠標(biāo)鍵盤均可以正常使用,然而接上U盤后,不能正常使用,U盤無法打開,感覺系統(tǒng)像是
    發(fā)表于 05-13 20:02

    翼輝信息入選2023年信息技術(shù)應(yīng)用創(chuàng)新解決方案名單

    近日,2023 年(第五屆)信息技術(shù)應(yīng)用創(chuàng)新解決方案公布遴選名單,歷經(jīng)資格初審、技術(shù)中評、區(qū)域評議、終評預(yù)審,翼輝以“面向工業(yè)領(lǐng)域嵌入式操作系統(tǒng) SylixOS 解決方案”,成功在全國優(yōu)秀方案中脫穎而出,入選典型解決方案名單。
    的頭像 發(fā)表于 04-28 11:37 ?478次閱讀
    翼輝<b class='flag-5'>信息</b>入選2023年<b class='flag-5'>信息技術(shù)</b>應(yīng)用創(chuàng)新解決方案名單

    STM32F407 USB HOST HID部分鼠標(biāo)鍵盤無法讀取數(shù)據(jù)的原因?

    初學(xué)STM32F4 USB,現(xiàn)在使用正點原子USB HID鼠標(biāo)鍵盤例程,該歷程使用2.1的庫,調(diào)試發(fā)現(xiàn)手里的鼠標(biāo)(一個有線,一個無線)可以識別,也能進鍵盤鼠標(biāo)的初始化程序,但是之后動
    發(fā)表于 04-22 08:22

    龍芯中科三項信創(chuàng)方案入圍工信部2023年信息技術(shù)應(yīng)用創(chuàng)新應(yīng)用示范案例名單

    近日,工業(yè)和信息化部通報了2023年信息技術(shù)應(yīng)用創(chuàng)新解決方案征集遴選結(jié)果,本次共評選出典型解決方案173個、應(yīng)用示范案例83個、單項創(chuàng)新案例64個。
    的頭像 發(fā)表于 03-07 16:45 ?771次閱讀
    龍芯中科三項信<b class='flag-5'>創(chuàng)</b>方案入圍工信部2023年<b class='flag-5'>信息技術(shù)</b>應(yīng)用創(chuàng)新應(yīng)用示范案例名單

    labview鼠標(biāo)坐標(biāo)怎么獲取

    獲取LabVIEW中鼠標(biāo)坐標(biāo)的方法實際上非常簡單。在LabVIEW的Block Diagram或Front Panel中,可以使用以下方法來獲取鼠標(biāo)的坐標(biāo): 使用
    的頭像 發(fā)表于 01-07 17:24 ?3432次閱讀

    闡述量子信息技術(shù)的研究現(xiàn)狀與未來

    20世紀(jì) 80 年代, 科學(xué)家將量子力學(xué)應(yīng)用到信息領(lǐng)域, 從而誕生了量子信息技術(shù), 諸如量子計算機、量子密碼、量子傳感等. 這些技術(shù)的運行規(guī)律遵從量子力學(xué), 因此不僅其原理是量子力學(xué), 器件本身也
    發(fā)表于 11-22 11:40 ?742次閱讀
    闡述量子<b class='flag-5'>信息技術(shù)</b>的研究現(xiàn)狀與未來

    Python 模擬鍵盤鼠標(biāo)的方式實現(xiàn)自動化

    在某些情況下,如果我們需要進行自動化操作的應(yīng)用沒有提供相應(yīng)的接口,我們無法直接通過Python來調(diào)用API實現(xiàn)自動化。這種情況下,Python也不是完全沒有辦法的,我們可以采用模擬鍵盤鼠標(biāo)的方式
    的頭像 發(fā)表于 11-02 14:48 ?1245次閱讀
    Python 模擬<b class='flag-5'>鍵盤</b><b class='flag-5'>鼠標(biāo)</b>的方式實現(xiàn)自動化

    無線鼠標(biāo)和接收器是一對一的關(guān)系嗎?無線鼠標(biāo)鍵盤的接收器丟了怎么辦?

    無線鼠標(biāo)和接收器是一對一的關(guān)系嗎?無線鼠標(biāo)鍵盤的接收器丟了怎么辦? 關(guān)于無線鼠標(biāo)和接收器的一對一關(guān)系,答案是不完全是。雖然大多數(shù)情況下無線鼠標(biāo)和接收器是成對出現(xiàn)的,但并不是說只有這個接
    的頭像 發(fā)表于 10-30 10:56 ?4574次閱讀

    OTG功能使用方法

    OTG功能使用方法? 什么是OTG功能? OTG(On-The-Go)即為“即插即用”的高速USB接口,在目前的市場上企業(yè)和普通消費者極度青睞,其在人們的生活中的應(yīng)用場景非常廣泛,比如U盤、鍵盤
    的頭像 發(fā)表于 10-30 09:57 ?3535次閱讀