當前位置:編程學習大全網 - 編程語言 - 如果當焦點處於其他應用程序時,如何攔截鍵盤事件?

如果當焦點處於其他應用程序時,如何攔截鍵盤事件?

WINDOWS的消息處理機制為了能在應用程序中監控系統的各種事件消息,提供了掛接 各種反調函數(HOOK)的功能。這種掛鉤函數(HOOK)類似擴充中斷驅動程序,掛鉤上 可以掛接多個反調函數構成壹個掛接函數鏈。系統產生的各種消息首先被送到各種 掛接函數,掛接函數根據各自的功能對消息進行監視、修改和控制等,然後交還控 制權或將消息傳遞給下壹個掛接函數以致最終達到窗口函數。WINDOW系統的這種反 調函數掛接方法雖然會略加影響到系統的運行效率,但在很多場合下是非常有用 的,通過合理有效地利用鍵盤事件的掛鉤函數監控機制可以達到預想不到的良好效 果。

壹、在WINDOWS鍵盤事件上掛接監控函數的方法

WINDOW下可進行掛接的過濾函數包括11種:

WH_CALLWNDPROC 窗口函數的過濾函數

WH_CBT 計算機培訓過濾函數

WH_DEBUG 調試過濾函數

WH_GETMESSAGE 獲取消息過濾函數

WH_HARDWARE 硬件消息過濾函數

WH_JOURNALPLAYBACK 消息重放過濾函數

WH_JOURNALRECORD 消息記錄過濾函數

WH_MOUSE 鼠標過濾函數

WH_MSGFILTER 消息過濾函數

WH_SYSMSGFILTER 系統消息過濾函數

WH_KEYBOARD 鍵盤過濾函數

其中鍵盤過濾函數是最常用最有用的過濾函數類型,不管是哪壹種類型的過濾函 數,其掛接的基本方法都是相同的。 WINDOW調用掛接的反調函數時總是先調用掛接鏈首的那個函數,因此必須將鍵盤掛 鉤函數利用函數SetWindowsHookEx()將其掛接在函數鏈首。至於消息是否傳遞給函 數鏈的下壹個函數是由每個具體函數功能確定的,如果消息需要傳統給下壹個函 數,可調用API函數的CallNextHookEx()來實現,如果不傳遞直接返回即可。 掛接函數可以是用來監控所有線程消息的全局性函數,也可以是單獨監控某壹線程 的局部性函數。如果掛接函數是局部函數,可以將它放到壹個.DLL動態鏈接庫中, 也可以放在壹個局部模塊中;如果掛接函數是全局的,那麽必須將其放在壹個.DLL 動態鏈接庫中。掛接函數必須嚴格按照下述格式進行聲明,以鍵盤掛鉤函數為例:

int FAR PASCAL KeyboardProc( int nCode,WORD wParam,DWORD lParam) 其中KeyboardProc為定義掛接函數名,該函數必須在模塊定義文件中利用EXPORTS命 令進行說明;nCode決定掛接函數是否對當前消息進行處理;wParam和lParam為具體 的消息內容。

二、鍵盤事件掛接函數的安裝與下載 在程序中可以利用函數SetWindowsHookEx()來掛接過濾函數,在掛接函數時必須指 出該掛接函數的類型、函數的入口地址以及函數是全局性的還是局部性的,掛接函 數的具體調用格式如下:

SetWindowsHookEx(iType,iProc,hInst,iCode) 其中iType為掛接函數類型,鍵盤類型為WH_KEYBOARD,iProc為掛接函數地址,hInst 為掛接函數鏈接庫實例句柄,iCode為監控代碼-0表示全局性函數。 如果掛接函數需要將消息傳遞給下壹個過濾函數,則在該掛接函數返回前還需要調 用壹次CallNextHookEx()函數,當需要下載掛接函數時,只要調用壹次 UnhookWindowsHookEx(iProc)函數即可實現。 如果函數是全局性的,那麽它必須放在壹個.DLL動態鏈接庫中,這時該函數調用方 法可以和其它普通.DLL函數壹樣有三種:

1.在DEF定義文件中直接用函數名或序號說明: EXPORTS WEP @1 RESIDENTNAME InitHooksDll @2 InstallFilter @3 KeyboardProc @4 用序號說明格式為:鏈接庫名.函數名(如本例中說明方法為KEYDLL.KeyboardProc)。

2.在應用程序中利用函數直接調用: 首先在應用程序中利用LoadLibrary(LPSTR "鏈接庫名")將動態鏈接庫裝入,並取得 裝載庫模塊句柄hInst,然後直接利用GetProcAddress(HINSTANCE hInst,LPSTR "函 數過程名")獲取函數地址,然後直接調用該地址即可,程序結束前利用函數 FreeLibrary( )釋放裝入的動態鏈接庫即可。

3.利用輸入庫.LIB方法 利用IMPLIB.EXE程序在建立動態鏈接庫的同時建立相應的輸入庫.LIB,然後直接在 項目文件中增加該輸入庫。

  • 上一篇:買DC,徘徊在kodak Z712和Z812之間,求它們的詳細比較
  • 下一篇:鋼材的鑒別
  • copyright 2024編程學習大全網