?? 全程鍵盤鉤子的一種簡單實現.txt
字號:
標題:全程鍵盤鉤子的一種簡單實現 查看此會員其它文章
文章的關鍵字:DLL 鍵盤鉤子
發布人:山海網絡 發布時間:2003-3-6 10:37:49
-----------------------------------------------------------------------
隨著中間件技術的發展, DLL越來越為程序員所關注,因為使用DLL具有一系列優點,所以程序設計人員可能更多的在自己的軟件中采用這種技術。
下面我就把以前做過的一個簡單的全程鍵盤鉤子分析一下。
鉤子[以下簡稱Hook]是應用程序在Microsoft Windows 消息處理過程中設置的用來監控消息流并且處理系統中尚未到達目的窗口的某一類型消息過程的機制。如果Hook過程在應用程序中實現,若應用程序不是當前窗口時,該Hook就不起作用;如果Hook在DLL中實現,程序在運行中動態調用它,它能實時對系統進行監控。根據需要,我們采用的是在DLL中實現Hook的方式[關于HOOK更詳細的資料請查閱資料]。
在VC中新建一Win32 Dynamic-Link Library 工程,工程名為KBLock。AppWizard會生成相關文件,編譯生成的KBLock.cpp:
#include "stdafx.h"
#include "KBLock.h"
HHOOK hhkHook=NULL; //定義鉤子句柄
HINSTANCE hInstance=NULL; //程序實例
//下面的DLLMain相當于Win32程序中的WinMain函數,是入口點
BOOL APIENTRY DllMain( HANDLE hModule,
DWORD ul_reason_for_call,
LPVOID lpReserved
)
{
switch (ul_reason_for_call)
{
case DLL_PROCESS_ATTACH:
case DLL_THREAD_ATTACH:
case DLL_THREAD_DETACH:
case DLL_PROCESS_DETACH:
break;
}
hInstance=(HINSTANCE)hModule; //得到DLL實例
return TRUE;
}
//這是處理鍵盤消息的主要函數,在其中進行禁止操作
LRESULT CALLBACK HookProc(int nCode,WPARAM wParam,LPARAM lParam)
{
if (nCode < 0)
{
return CallNextHookEx(hhkHook,nCode,wParam,lParam);
}
if (nCode != HC_ACTION)
{
return CallNextHookEx(hhkHook,nCode,wParam,lParam);
}
//給出提示:鍵盤已經被鎖定,要進行判斷,看是否已有提示窗口,否則會彈個沒完
if (!::FindWindow(0, "KeyBoard Locked"))
{
::MessageBox(0,"鍵盤已經鎖定!!!","KeyBoard Locked",MB_OK);
}
return 1; //沒有return CallNextHookEx(hhkHook,nCode,wParam,lParam)則不會把消息//傳遞下去,所以我們的鍵盤就不起作用了
}
// This is an example of an exported variable
//導出函數:啟動鍵盤鎖定
BOOL EnableKeyboardCapture()
{
if(!(hhkHook=SetWindowsHookEx(WH_KEYBOARD,(HOOKPROC)HookProc,hInstance,0)))
return FALSE;
return TRUE;
}
//導出函數:解除鍵盤鎖定
BOOL DisableKeyboardCapture()
{
return UnhookWindowsHookEx(hhkHook);
}
上面就是DLL中最重要的代碼,當然要使DLL能正常工作還要編輯KBLock.h文件:
__declspec(dllexport) BOOL EnableKeyboardCapture(); //加載鉤子
__declspec(dllexport) BOOL DisableKeyboardCapture(); //卸載鉤子
再編輯KBLock.def
; KBLock.def : Declares the module parameters for the DLL.
LIBRARY "KBLock"
DEs criptION 'KBLock Windows Dynamic Link Library'
EXPORTS
; Explicit exports can go here
EnableKeyboardCapture @1
DisableKeyboardCapture @2
這樣我們用Depends.exe查看這個DLL時,就會發現這兩個導出函數了。
DLL方面的工作已經完成,這樣我們就可以在程序中調用它了。
雖然DLL是由VC開發的,但調用它的前臺程序可以用任何其它支持DLL調用的語言如:VB、VC、DELPHI、Win32asm實現,下面還是以VC為例,實現DLL的調用。
建一基于Dialog的工程,在其中加入兩個按鈕:“Lock KeyBoard”“UnLock”
在CexeDlg類中加入一個成員函數:
/*sign = TRUE 鎖定 sign = FALSE解鎖*/
BOOL CExeDlg::KBLock(BOOL sign)
{
hDLL=::LoadLibrary((LPCTSTR)"KBLock"); //加載DLL
if (hDLL!=NULL)
{loadhook=(LOADHOOK)::GetProcAddress (hDLL,"EnableKeyboardCapture");
unloadhook=(UNLOADHOOK)::GetProcAddress (hDLL,"DisableKeyboardCapture");
if(loadhook==NULL||unloadhook==NULL)
{::MessageBox(0,"對不起,本功能不能使用!!!","Somthing Wrong",MB_OK);
return 0;
}
if(sign)
loadhook();
else
{
unloadhook();
::FreeLibrary(hDLL);
}
return 1;
}
::MessageBox(0,"動態庫加載失敗!!!","Somthing Wrong",MB_OK);
return 0;
}
其中用到了事先定義好的全局變量:
typedef BOOL (CALLBACK *LOADHOOK)();
typedef BOOL (CALLBACK *UNLOADHOOK)();
HINSTANCE hDLL=NULL;
LOADHOOK loadhook;
UNLOADHOOK unloadhook;
這樣我們在兩個按鈕中分別加入KBLock(TRUE); 和 KBLock(FALSE);即可。
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -