最近在搞鍵盤訊息的東西,看了一篇文章,覺得不錯,拿來跟大家一塊分享下
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。不但包括 ...