?? mydll.cpp
字號:
//---------------------------------------------------------------------------
//掛上、卸下hook,并運用內存中共享區塊傳遞hook數據
//---------------------------------------------------------------------------
#include <vcl.h> //原有的頭文件
#include <windows.h> //原有的頭文件
#include <stdio.h> //加入C++字符串的頭文件
#pragma hdrstop
#pragma argsused
//---------------------------------------------------------------------------
//DLL的固定聲明
HHOOK hHook;//掛上的hook handle
HINSTANCE ghInst;//連接文件的模塊handle,固定進程
HWND hAppWnd;//執行此dll的特定exe程序handle__"TMouseHookForm"
//存于內存中,dll和exe共享的結構,用于傳遞捕捉到的hook信息
struct POD
{
char text[256];
//...user可自行擴充此結構成員
} *buf; //指向內存共享區塊的指針
HANDLE maphandle;//共享的內存區塊handle
//---------------------------------------------------------------------------
//符合以C語言編譯的DLL輸出函數
extern "C" __declspec(dllexport) __stdcall void SetHook(void);
extern "C" __declspec(dllexport) __stdcall void RemoveHook(void);
//---------------------------------------------------------------------------
//重載的MouseProc函數,持續送出鼠標全域信息
LRESULT CALLBACK MouseProc(int, WPARAM, LPARAM);
//---------------------------------------------------------------------------
//DLL的構造函數和析構函數
int WINAPI DllEntryPoint(HINSTANCE hinst, unsigned long reason, void*)
{
ghInst = hinst;
//當此DLL被調用或結束
switch(reason)
{
case DLL_PROCESS_ATTACH: //此DLL的構造函數
//取得執行此dll的特定程序handle
hAppWnd = ::FindWindow("TCallHookForm", 0);
//打開已經存在的共享內存區域
maphandle = ::OpenFileMapping( FILE_MAP_WRITE, false, "MyMapName");
//if(!maphandle) return;
//轉換成可擦寫的對象指針
buf = (POD *)::MapViewOfFile( maphandle,
FILE_MAP_READ | FILE_MAP_WRITE,
0, 0, 0 );
//if(!buf) return;
break;
case DLL_PROCESS_DETACH: //此DLL的析構函數
//釋放內存區塊
::UnmapViewOfFile((void *)buf);
break;
}
return 1;
}
//---------------------------------------------------------------------------
//注冊自定義hook到hook鏈中
void __stdcall SetHook(void)
{//若Hook尚未掛到信息鏈中,則將本鼠標信息dll注冊到hook鏈中
if(hHook == NULL)
{
hHook = ::SetWindowsHookEx(WH_MOUSE, (HOOKPROC)MouseProc, ghInst, 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);
}
//---------------------------------------------------------------------------
//重載的MouseProc函數,持續送出鼠標全域信息
LRESULT CALLBACK MouseProc(int nCode, WPARAM wParam, LPARAM lParam)
{
//若未掛上Hook鏈,就交給下一個hook鏈
if(nCode < 0)
return ::CallNextHookEx(hHook, nCode, wParam, lParam);
//若已經掛上Hook鏈,則檢測鼠標信息
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -