VC6 0下實現遮蔽鍵盤按鍵

2021-05-27 19:59:00 字數 3943 閱讀 2569

最近在搞鍵盤訊息的東西,看了一篇文章,覺得不錯,拿來跟大家一塊分享下

1 問題的引入

隨著計算機的廣泛應用,計算機軟體得到了長遠發展。在軟體開發過程中,希望產品獨佔系統資源,或者希望規範用

戶行為,例如不希望使用者通過alt + tab 組合鍵切換到其他應用程式或者通過win 鍵彈出開始選單。遊戲娛樂也已慢慢

成為人們生活中的一部分,其中有些軟體是在全屏模式下執行,這時誤按win 鍵或alt + tab 時會造成麻煩。在工程測

試時,有些時候也需要遮蔽部分按鍵,以減少誤操作。然而諸如win 鍵、alt + tab 組合鍵、alt + esc 組合鍵等的按

鍵響應屬於系統級的,不能簡單地通過過載訊息處理函式的方法來對其進行遮蔽。那麼如何實現系統範圍內遮蔽這些

按鍵呢?在此介紹了在vc6.0 環境下,通過hook (鉤子) 技術實現window nt 及以上系統遮蔽鍵盤按鍵的方法。

2 hook 及相關api

2.1 hook

hook 技術即鉤子技術。簡單地說,鉤子是一種通過替換系統提供的標準介面來截獲特定的事件(訊息),最終達

到改變或增強系統預設行為目的的技術。鉤子通過鉤子過程實現需求,鉤子過程實際上是乙個處理訊息的程式段(函

數),通過系統呼叫,把它掛入系統。每當特定的訊息發出,在沒有到達目的視窗前,鉤子程式就先捕獲該訊息,亦

即鉤子過程先得到控制權。這時鉤子過程既可以加工處理(改變) 該訊息,也可以不作處理而繼續傳遞該訊息,還

可以強制結束該訊息的傳遞。

每乙個hook 都有乙個與之相關聯的指標列表,稱之為鉤子鍊錶,由系統來維護。

鉤子分為本地鉤子(local hook) 和遠端鉤子(remotehook),又稱區域性鉤子和全域性鉤子。localhook

是指程式hook 的是本程式中的執行緒。remote hook 有兩種形式:一種是對其他程式中某個特定的執行緒;一種是

對整個系統。在此將通過區域性鉤子和全域性鉤子兩種方式實現遮蔽鍵盤按鍵。

2.2 鉤子相關api 及鉤子函式

2.2.1 setwindowshookex ()

setwindowshookex 函式的作用是安裝乙個應用程式定義的鉤子過程。如果呼叫成功,setwindowshookex 函式

的返回值就是所安裝的鉤子過程的控制代碼,否則返回null。函式原型:

hhook setwindowshookex (

int idhook,

hookproc lpfn,

hinstance hmod,

dword dwthreadid

) ;該函式各引數含義如下:

(1) idhook

指定要安裝的鉤子過程型別,此引數可以是表1 列出的值之一。

表1 idhook 取值

(2) lpfn

指向相應的鉤子過程。

(3) hmod

指定lpfn 指向的鉤子過程所在的dll 的控制代碼。如果引數dwthreadid 指定的執行緒由當前程序建立,並且相應的鉤子過程

定義於當前程序相關的**中,那麼必須將引數hmod 設定為null。

(4) dwthreadid

指定與當前鉤子過程相關的執行緒標識。如果其值為0,那麼安裝的鉤子過程將與桌面上執行的所有執行緒都相關。

2.2.2 鉤子過程

鉤子過程的定義形式如下:

lresult callback hookproc (

int ncode,

wparam wparam,

lparam lparam

) ;各引數的含義及取值如下:

(1) ncode

ncode 引數是hook **,hook 過程使用這個引數來確定任務。這個引數的值依賴於hook 型別,每一種

hook都有自己的hook **特徵字符集。

(2) wparam 和lparam

wparam 和lparam 引數的值依賴於hook **,但是它們的典型值是包含了關於傳送或者接收訊息的資訊。

2.2.3 callnexthookex ()

在鉤子過程中對資訊處理完成之後,如果想把資訊繼續傳遞給鉤子鏈中的下乙個鉤子過程,可以調callnexthookex

lresult callnexthookex (

hhook hhk,

int ncode,

wparam wparam,

lparam lparam) ;

其中第乙個引數(hhk) 指定當前鉤子過程控制代碼,就是呼叫setwindowshookex 函式成功後得到的返回值,其他3 個參

數與相應的鉤子過程的引數相同,就是同hookproc 函式的引數。

3 實現遮蔽鍵盤按鍵

由於一般的鍵盤按鍵都容易遮蔽,win 鍵及一些組合鍵如alt + tab、alt + esc、ctrl+esc 等比較「倔強」,較難遮蔽。下面就以遮蔽win 鍵、alt + tab 組合鍵、alt + esc 組合鍵、ctrl+ esc 組合鍵為例,討論遮蔽鍵盤按鍵的實現方法。

3.1 使用區域性鉤子

使用區域性鉤子就是不用dll,在vc 程式直接呼叫相應的api 函式。

宣告全域性變數hhook g_hook;

//因為鉤子過程是乙個典型的c 函式,不屬於類的成員

(1) 鉤子過程函式

lresult winapi hookproc ( int ncode, wparam wparam, lparam lparam)

}return ( bkeytoshield ? true : callnexthookex(g_hook, ncode, wparam, lparam)) ;}

(2) 安裝鉤子

if (g_hook == null)

(3) 解除安裝鉤子

if (! unhookwindowshookex (g_hook))

3.2 使用遠端鉤子

使用遠端鉤子時,要編寫乙個動態鏈結庫檔案,即dll 檔案,通過呼叫dll 中的匯出函式來遮蔽按鍵。

首先,編寫dll 檔案,假設命名為keyboardhook.dll:

/**************************************keyboardhook.dll**************************************/

#define _win32_winnt 0x0400

#include

hhook g_hkeyboard = null;

#pragma data_seg (" mysec")

hwnd g_hwnd = null;

#pragma data_seg ()

#pragma comment (linker, " /section:mysec,rws")

... //此處為鉤子過程函式,與方案一中的鉤子過程函式相同,不再重複,其中函式名改為keyboardhookproc

void sethook (hwnd hwnd) //安裝鉤子

void unhook (void) //解除安裝鉤子

/************ ******************************dllend******************************************/

另外在dll 的def 檔案中指明匯出函式如下:

exports

sethook @2

unhook @3

並指出mysec 的屬性為可讀可寫且是共享的:

segments

mysecread write shared

完成了dll 的編寫,就在可以在vc 程式中使用這個dll 來達到目標。

在使用該dll 時,程式中應首先做如下宣告:

_declspec (dllimport) void sethook (hwnd hwnd) ;

_declspec (dllimport) void unhook (void) ;

然後通過呼叫sethook (m_hwnd) 和unhook () 便可以安裝或解除安裝鍵盤鉤子,以實現遮蔽按鍵的目的。

VC 6 0實現超連結

vc 6.0實現超連結 2011年05月03日 首先,新建乙個基於對話方塊的工程,新增乙個靜態文字框,id為idc html。caption為然後新增單擊訊息對映,新增以下 void cmydlg onhtml bool bblue false cfont cfont1 cfont cfont2 在...

在VC 6 0下設定GDI

2.在你將要使用gdi 的工程中,完成初始化工作 在stdafx.h中加入 define ulong ptr unsigned long include using namespace gdiplus include gdiplus.h gdiplusstartupinput m gdiplusst...

VC 6 0下wxWidgets工具的配置

和 gtk qt swt swing 一樣,wxwidgets 也是一種開源跨平台的 gui 框架。因 wxwidgets 和 mfc 有些淵源,有些親近,故要體驗一番 wxwidgets。現在最新版是 2.8.7。wxwidgets 程式還可執行於 windows ce palm os。不但包括 ...