天天被操天天被操综合网,亚洲黄色一区二区三区性色,国产成人精品日本亚洲11,欧美zozo另类特级,www.黄片视频在线播放,啪啪网站永久免费看,特别一级a免费大片视频网站

現(xiàn)在位置:范文先生網(wǎng)>理工論文>計算機信息技術>鍵盤事件的掛鉤監(jiān)控原理及其應用

鍵盤事件的掛鉤監(jiān)控原理及其應用

時間:2022-08-19 05:11:43 計算機信息技術 我要投稿
  • 相關推薦

鍵盤事件的掛鉤監(jiān)控原理及其應用

WINDOWS的消息處理機制為了能在應用程序中監(jiān)控系統(tǒng)的各種事件消息,提供了掛接 各種反調函數(shù)(HOOK)的功能。這種掛鉤函數(shù)(HOOK)類似擴充中斷驅動程序,掛鉤上 可以掛接多個反調函數(shù)構成一個掛接函數(shù)鏈。系統(tǒng)產(chǎn)生的各種消息首先被送到各種 掛接函數(shù),掛接函數(shù)根據(jù)各自的功能對消息進行監(jiān)視、修改和控制等,然后交還控 制權或將消息傳遞給下一個掛接函數(shù)以致最終達到窗口函數(shù)。WINDOW系統(tǒng)的這種反 調函數(shù)掛接方法雖然會略加影響到系統(tǒng)的運行效率,但在很多場合下是非常有用 的,通過合理有效地利用鍵盤事件的掛鉤函數(shù)監(jiān)控機制可以達到預想不到的良好效 果。 
一、在WINDOWS鍵盤事件上掛接監(jiān)控函數(shù)的方法 
WINDOW下可進行掛接的過濾函數(shù)包括11種: 
WH_CALLWNDPROC 窗口函數(shù)的過濾函數(shù) 
WH_CBT 計算機培訓過濾函數(shù) 
WH_DEBUG 調試過濾函數(shù) 
WH_GETMESSAGE 獲取消息過濾函數(shù) 
WH_HARDWARE 硬件消息過濾函數(shù) 
WH_JOURNALPLAYBACK 消息重放過濾函數(shù) 
WH_JOURNALRECORD 消息記錄過濾函數(shù) 
WH_MOUSE 鼠標過濾函數(shù) 
WH_MSGFILTER 消息過濾函數(shù) 
WH_SYSMSGFILTER 系統(tǒng)消息過濾函數(shù) 
WH_KEYBOARD 鍵盤過濾函數(shù)
其中鍵盤過濾函數(shù)是最常用最有用的過濾函數(shù)類型,不管是哪一種類型的過濾函 數(shù),其掛接的基本方法都是相同的。 WINDOW調用掛接的反調函數(shù)時總是先調用掛接鏈首的那個函數(shù),因此必須將鍵盤掛 鉤函數(shù)利用函數(shù)SetWindowsHookEx()將其掛接在函數(shù)鏈首。至于消息是否傳遞給函 數(shù)鏈的下一個函數(shù)是由每個具體函數(shù)功能確定的,如果消息需要傳統(tǒng)給下一個函 數(shù),可調用API函數(shù)的CallNextHookEx()來實現(xiàn),如果不傳遞直接返回即可。 掛接函數(shù)可以是用來監(jiān)控所有線程消息的全局性函數(shù),也可以是單獨監(jiān)控某一線程 的局部性函數(shù)。如果掛接函數(shù)是局部函數(shù),可以將它放到一個.DLL動態(tài)鏈接庫中, 也可以放在一個局部模塊中;如果掛接函數(shù)是全局的,那么必須將其放在一個.DLL 動態(tài)鏈接庫中。掛接函數(shù)必須嚴格按照下述格式進行聲明,以鍵盤掛鉤函數(shù)為例: 
int FAR PASCAL KeyboardProc( int nCode,WORD wParam,DWORD lParam) 其中KeyboardProc為定義掛接函數(shù)名,該函數(shù)必須在模塊定義文件中利用EXPORTS命 令進行說明;nCode決定掛接函數(shù)是否對當前消息進行處理;wParam和lParam為具體 的消息內容。

二、鍵盤事件掛接函數(shù)的安裝與下載 在程序中可以利用函數(shù)SetWindowsHookEx()來掛接過濾函數(shù),在掛接函數(shù)時必須指 出該掛接函數(shù)的類型、函數(shù)的入口地址以及函數(shù)是全局性的還是局部性的,掛接函 數(shù)的具體調用格式如下: 
SetWindowsHookEx(iType,iProc,hInst,iCode) 其中iType為掛接函數(shù)類型,鍵盤類型為WH_KEYBOARD,iProc為掛接函數(shù)地址,hInst 為掛接函數(shù)鏈接庫實例句柄,iCode為監(jiān)控代碼-0表示全局性函數(shù)。 如果掛接函數(shù)需要將消息傳遞給下一個過濾函數(shù),則在該掛接函數(shù)返回前還需要調 用一次CallNextHookEx()函數(shù),當需要下載掛接函數(shù)時,只要調用一次 UnhookWindowsHookEx(iProc)函數(shù)即可實現(xiàn)。 如果函數(shù)是全局性的,那么它必須放在一個.DLL動態(tài)鏈接庫中,這時該函數(shù)調用方 法可以和其它普通.DLL函數(shù)一樣有三種: 
1.在DEF定義文件中直接用函數(shù)名或序號說明: EXPORTS WEP @1 RESIDENTNAME InitHooksDll @2 InstallFilter @3 KeyboardProc @4 用序號說明格式為:鏈接庫名.函數(shù)名(如本例中說明方法為KEYDLL.KeyboardProc)。 
2.在應用程序中利用函數(shù)直接調用: 首先在應用程序中利用LoadLibrary(LPSTR "鏈接庫名")將動態(tài)鏈接庫裝入,并取得 裝載庫模塊句柄hInst,然后直接利用GetProcAddress(HINSTANCE hInst,LPSTR "函 數(shù)過程名")獲取函數(shù)地址,然后直接調用該地址即可,程序結束前利用函數(shù) FreeLibrary( )釋放裝入的動態(tài)鏈接庫即可。 
3.利用輸入庫.LIB方法 利用IMPLIB.EXE程序在建立動態(tài)鏈接庫的同時建立相應的輸入庫.LIB,然后直接在 項目文件中增加該輸入庫。

三、WINDOWS掛鉤監(jiān)控函數(shù)的實現(xiàn)步驟 WINDOWS掛鉤函數(shù)只有放在動態(tài)鏈接庫DLL中才能實現(xiàn)所有事件的監(jiān)控功能。在.DLL 中形成掛鉤監(jiān)控函數(shù)基本方法及其基本結構如下: 

1、首先聲明DLL中的變量和過程;

2、然后編制DLL主模塊LibMain(),建立模塊實例;

3、建立系統(tǒng)退出DLL機制WEP()函數(shù);

4、完成DLL初始化函數(shù)InitHooksDll(),傳遞主窗口程序句柄; 

5、編制掛鉤安裝和下載函數(shù)InstallFilter(); 

6、編制掛鉤函數(shù)KeyboardProc(),在其中設置監(jiān)控功能,并確定繼續(xù)調下一個鉤 子函數(shù)還是直接返回WINDOWS應用程序。

7、在WINDOWS主程序中需要初始化DLL并安裝相應掛鉤函數(shù),由掛接的鉤子函數(shù)負 責與主程序通信;

8、在不需要監(jiān)控時由下載功能卸掉掛接函數(shù)。

四、WINDOWS下鍵盤掛鉤監(jiān)控函數(shù)的應用技術 目前標準的104 鍵盤上都有兩個特殊的按鍵,其上分別用WINDOW程序徽標和鼠標下 拉列表標識,本文暫且分別稱為Micro左鍵和Micro右鍵,前者用來模擬鼠標左鍵激 活開始菜單,后者用來模擬鼠標右鍵激活屬性菜單。這兩個特殊按鍵只有在按下后 立即抬起即完成 CLICK過程才能實現(xiàn)其功能,并且沒有和其它按鍵進行組合使用。 由于WINDOWS 系統(tǒng)中將按鍵劃分得更加詳細,使應用程序中很難靈活定義自己的專 用快捷鍵,比如在開發(fā).IME等應用程序時很難找到不與WORD8.0等其它應用程序沖突 的功能按鍵。如果將標準104鍵盤中的這兩個特殊按鍵作為模擬CTRL和ALT 等專用按 鍵,使其和其它按鍵組合,就可以在自己的應用程序中自由地設置專用功能鍵,為 應用程序實現(xiàn)各種功能快捷鍵提供靈活性。正常情況下WINDOWS 鍵盤事件驅動程序 并不將這兩個按鍵的消息進行正常解釋,這就必須利用鍵盤事件的掛鉤監(jiān)控函數(shù)來 實現(xiàn)其特定的功能。其方法如下:

1、首先編制如下一個簡單動態(tài)鏈接庫程序,并編譯成DLL文件。 #include "windows.h" 
int FAR PASCAL LibMain(HANDLE hModule,UINT wDataSeg, UINT cbHeapSize,LPSTR lpszCmdLine); 
int WINAPI WEP(int bSystemExit); 
int WINAPI InitHooksDll(HWND hwndMainWindow); 
int WINAPI InstallFilter(BOOL nCode); 
LRESULT CALLBACK KeyHook(int nCode,WORD wParam,DWORD lParam); 
static HANDLE hInstance; // 全局句柄 
static HWND hWndMain; // 主窗口句柄 
static int InitCalled=0; // 初始化標志 
static HHOOK hKeyHook; 
FARPROC lpfnKeyHook=(FARPROC)KeyHook; 
BOOL HookStates=FALSE; 
int FAR PASCAL LibMain( HANDLE hModule, UINT wDataSeg, UINT cbHeapSize, LPSTR lpszCmdLine) 
{
if (cbHeapSize!=0) 
UnlockData(0); 
hInstance = hModule; 
return 1; 
} 
int WINAPI WEP (int bSystemExit) 
{ return 1;} 
int WINAPI InitHooksDll(HWND hwndMainWindow) 
{ 
hWndMain = hwndMainWindow; 
InitCalled = 1; 
return (0); 
}

鍵盤事件的掛鉤監(jiān)控原理及其應用

int WINAPI InstallFilter(BOOL nCode) 
{ if (InitCalled==0) 
return (-1); 
if (nCode==TRUE) 
{ 
hKeyHook=SetWindowsHookEx(WH_KEYBOARD, (HOOKPROC)lpfnKeyHook,hInstance,0); 
HookStates=TRUE; 
} 
else 
{ 
UnhookWindowsHookEx(hKeyHook); 
HookStates=FALSE; 
} 
return(0); 
} 

LRESULT CALLBACK KeyHook(int nCode,WORD wParam,DWORD lParam) 
{ 
static BOOL msflag=FALSE; 
if(nCode>=0) 
{ 
if(HookStates==TRUE)
{ 
if((wParam==0xff)|| //WIN3.X下按鍵值 
(wParam==0x5b)||(wParam==0x5c)){//WIN95下按鍵值 
if((i==0x15b)||(i==0x15c)){ //按鍵按下處理 
msflag=TRUE; 
PostMessage(hWndMain,0x7fff,0x1,0x3L); 
} 
else if((i==0xc15b)||(i==0xc15c)){//按鍵抬起處理 msflag=FALSE; 
PostMessage(hWndMain,0x7fff,0x2,0x3L); 
} 
} 
} 
} 
return((int)CallNextHookEx
(hKeyHook,nCode,wParam,lParam)); 
} 
該程序的主要功能是監(jiān)控鍵盤按鍵消息,將兩個特殊按鍵Micro按下和抬起消息轉換 成自定義類型的消息,并將自定義消息發(fā)送給應用程序主窗口函數(shù)。

2、在應用程序主函數(shù)中建立窗口后,調用InitHooksDll()函數(shù)來初始化動態(tài)鏈接 庫,并將應用程序主窗口句柄傳遞給鏈接庫,然后調用InstallFilter()函數(shù)掛接鍵 盤事件監(jiān)控回調函數(shù)。 
InitHooksDll(hIMEWnd); //初始化DLL 
InstallFilter(TRUE); //安裝鍵盤回調函數(shù) 

3、在應用程序主窗口函數(shù)處理自定義消息時,保存Micro按鍵的狀態(tài),供組合按鍵 處理時判斷使用。 
switch (iMessage) 
{ 
case 0x7fff: //自定義消息類型 
if(lParam==0x3L)
{//設置Micro鍵的狀態(tài) 
if(wParam==0x1) 
MicroFlag=TRUE; 
else if(wParam==0x2) 
MicroFlag=FALSE; 
} 
break; 

4、在進行按鍵組合處理時,首先判斷Micro鍵是否按下,然后再進行其它按鍵的判 斷處理。 
case WM_KEYDOWN: // 按鍵按下處理 
if(MicroFlag==TRUE)
{
//Micro鍵按下 
if((BYTE)HIBYTE(wParam)==0x5b)
{ 
//Micro+"["組合鍵 ......//按鍵功能處理 } 
else if((BYTE)HIBYTE(wParam)==0x5d)
{ 
//Micro+"]"組合鍵 ......//按鍵功能處理 } } break; 

5、當應用程序退出時應注意下載鍵盤監(jiān)控函數(shù),即調用InstallFilter(FALSE)函 數(shù)一次。 

6、利用本文提供的方法設置自己的應用程序功能按鍵,在保證程序功能按鍵不會 與其它系統(tǒng)發(fā)生沖突的同時,有效地利用了系統(tǒng)中現(xiàn)有資源,而且在實現(xiàn)應用程序 功能的同時靈活應用了系統(tǒng)中提供的各種功能調用。