?? keydll.cpp
字號:
//---------------------------------------------------------------------------
//掛上、卸下Keyboard hook,并運用自定義信息傳遞Hook數據
//---------------------------------------------------------------------------
#include <vcl.h> //原有BCB 頭文件
#include <windows.h> //原有window 頭文件
#pragma hdrstop
#pragma argsused
//自定義的鍵盤信息,與執行文件TKeyHookForm中自定義的鍵盤信息相互對應
const int WM_KEYHOOK = WM_USER+100;
//---------------------------------------------------------------------------
//DLL的固定聲明
HHOOK hHook;//掛上的hook handle
HWND hAppWnd;//執行此dll的特定exe程序handle__"TKeyHookForm"
HINSTANCE inst;//連接文件的模塊handle,固定行程
//---------------------------------------------------------------------------
//符合以C語言編譯的DLL輸出函數
extern "C" {
__declspec(dllexport) __stdcall void SetHook(void);
__declspec(dllexport) __stdcall void RemoveHook(void);
}
//---------------------------------------------------------------------------
//重載的KeyboardProc函數,持續送出鍵盤全域信息
LRESULT CALLBACK KeyboardProc(int, WPARAM, LPARAM);
//---------------------------------------------------------------------------
//DLL的構造函數與析構函數
int WINAPI DllEntryPoint(HINSTANCE hinst, unsigned long reason, void*)
{
inst = hinst;
//當此DLL被調用or結束
switch (reason)
{
case DLL_PROCESS_ATTACH ://此DLL構造函數
//取得執行此dll的特定程序handle
hAppWnd = ::FindWindow("TKeyHookForm", 0);
break;
case DLL_PROCESS_DETACH://此DLL析構函數
break;
case DLL_THREAD_ATTACH: //此DLL多線程構造函數
break;
case DLL_THREAD_DETACH: //此DLL多線程析構函數
break;
}
return 1;
}
//---------------------------------------------------------------------------
//注冊自定義hook到hook鏈中
void __stdcall SetHook(void)
{//若Hook尚未掛上信息鏈中,則將本鼠標信息dll注冊至hook鏈中
if(hHook == NULL)
{
hHook = ::SetWindowsHookEx(WH_KEYBOARD, (HOOKPROC)KeyboardProc, inst, 0);
//顯示是否掛上hook,測試用!
if(hHook == NULL)
MessageBox(NULL, "Sorry! 無法掛上Hook。", "Hook DLL", MB_OK);
else
::TextOut(GetDC(0),10,10,"掛上Hook。",10);
}
}
//---------------------------------------------------------------------------
//在hook鏈中,解除自定義的hook
void __stdcall RemoveHook(void)
{//若Hook已經掛上信息鏈,則卸下此Hook信息
if(hHook != NULL)
{
if(::UnhookWindowsHookEx(hHook) != FALSE)
{
hHook = NULL;
::TextOut(GetDC(0),50,10,"釋放Hook。",10);
}
else //測試用!
MessageBox(NULL, "Sorry! 無法釋放Hook。", "Hook DLL", MB_OK);
}
else //測試用!
::TextOut(GetDC(0),80,10,"Hook isn't NULL",16);
}
//---------------------------------------------------------------------------
//重載的KeyboardProc函數,持續送出鍵盤全域信息
LRESULT CALLBACK KeyboardProc(int nCode, WPARAM wParam, LPARAM lParam)
{
//若未掛上Hook鏈或鍵盤無信息輸出,就交予下一hook鏈
if((nCode < 0) || nCode == HC_NOREMOVE)
return ::CallNextHookEx(hHook, nCode, wParam, lParam);
//若信息重復,則跳至下一hook鏈
if(lParam & 0x40000000)
return ::CallNextHookEx(hHook, nCode, wParam, lParam);
//若在DLL建構式中,取得執行此dll的特定程序handle,即送出自定義鍵盤信息
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -