钩子的创建
钩子安装函数:
HHOOK SetWindowsHookEx(
int idHook, // hook type 钩子的类型
HOOKPROC lpfn, // hook procedure 钩子的过程函数
HINSTANCE hMod, // handle to application instance 动态链接库的句柄
DWORD dwThreadId // thread identifier 线程ID
);
第一个参数用来指定安装的钩子类型 如果你要屏蔽鼠标消息 指定WH_MOUSE 屏蔽案件消息 WH_KEYBOARD
第二个参数指向相应的钩子过程
第三个参数由第四个参数决定 如果你是要设置其他进程的线程的钩子 或是全局钩子的话 那么这里就是动态链接库的模块句柄,否则为空 要得到DLL的句柄可以 通过DllMain的第一个参数 或GetModuleHandle("Hook")得到
第四个参数指定要安装的HOOK的线程ID 0表示所有线程ID 得到本线程ID GetCurrentThreadId
返回值:如果调用成功 返回HHOOK句柄 否则返回NULL
钩子过程
返回1表示处理了操作系统将不会在将消息递下去给应用程序做响应
否则 应调用CallNextHookEx将消息给下一个在等待的钩子处理 并且将其作为返回值返回.
LRESULT CallNextHookEx(
HHOOK hhk, // handle to current hook
int nCode, // hook code passed to hook procedure
WPARAM wParam, // value passed to hook procedure
LPARAM lParam // value passed to hook procedure
);
动态链接库实现真正的共享
其实在某个进程 要对动态链接库的某个数据页面 进行写的操作时,在里面有种机制叫写入拷贝.
就是说 如果进程A想要对DLL中的某个数据1写时,首先DLL会新建一个数据2页面并对那个数据1进行复制.然后当进程A真正的要写进值时,写入的就是数据2.当进程B要读取时,读取的还是数据1,它也要写入时就另说.
为了解决上面那个问题.
1.首先建立节.
示例 如果要将HWND g_hWnd共享:
#pragma data_seg("MySec") //括号后内是节名 ,一般的都是 前面带了.的 我们可以自行加或不加
HWND g_hWnd=NULL; //必须初始化
#pragma data_seg()
2.将节设置为共享的节
设置为共享节有两方法#pragma comment(linker,"/section:MySec,RWS") //括号内的linker,"/section:当固定写法吧,最后的第三个参数RWS代表着READ WRITE SHARED
还有就是搞个模块文件
HOOK.DEF/
LIBRARY Hook
EXPORTS
SetHook @2
SEGMENTS
MySec READ WRITE SHARED
上面的@2表示将导出的函数 序号设为2
全局钩子的实现:
1.先写DLL文件 里面实现钩子过程 和 安装钩子
//HOOK.DLL/
#include <windows.h>
HHOOK g_hMouse=NULL;
HHOOK g_hKeyboard=NULL;
#pragma data_seg("MySec")
HWND g_hWnd=NULL;
#pragma data_seg()
//#pragma comment(linker,"/section:MySec,RWS")
/*HINSTANCE g_hInst;
BOOL WINAPI DllMain(
HINSTANCE hinstDLL, // handle to the DLL module
DWORD fdwReason, // reason for calling function
LPVOID lpvReserved // reserved
)
{
g_hInst=hinstDLL;
}*/
LRESULT CALLBACK MouseProc(
int nCode, // hook code
WPARAM wParam, // message identifier
LPARAM lParam // mouse coordinates
)
{
return 1;
}
LRESULT CALLBACK KeyboardProc(
int code, // hook code
WPARAM wParam, // virtual-key code
LPARAM lParam // keystroke-message information
)
{
if(VK_F2==wParam)
{
SendMessage(g_hWnd,WM_CLOSE,0,0);
UnhookWindowsHookEx(g_hMouse);
UnhookWindowsHookEx(g_hKeyboard);
}
return 1;
}
void SetHook(HWND hwnd)
{
g_hWnd=hwnd;
g_hMouse=SetWindowsHookEx(WH_MOUSE,MouseProc,GetModuleHandle("Hook"),0);
g_hKeyboard=SetWindowsHookEx(WH_KEYBOARD,KeyboardProc,GetModuleHandle("Hook"),0);
}
//HOOK.DEF///
LIBRARY Hook
EXPORTS
SetHook @2
SEGMENTS
MySec READ WRITE SHARED
2.在客户端中调用就是了.不多写加载DLL了