利用全局钩子 在别的进程窗口下 关闭test窗口
举报 2013-12-05 14:03
提问者采纳
对于DLL被多个进程使用时
多个进程会共用DLL的代码页面和数据页面
但是
如果不设置共享节 全局变量 g_hwnd被赋值时,进程修改变量时,会额外开辟属于进程自己的数据空间
导致这个变量并没有被各个进程共享
在DLL CPP中
#include <Windows.h>
#pragma data_seg("MySec") //字符最大长度8 多了会自动截掉
HWND g_hwnd = NULL; //新节中放置变量 必须初始化
#pragma data_seg()
#pragma comment(linker,"/section:MySec,RWS")
//指令类型为linker 表明该行代码用来指定链接选项
//将MySec 这个节 设置为 读 写 共享 类型 read write shared
HHOOK g_hMouse=NULL;
HHOOK g_hKeyboard=NULL;
//鼠标钩子过程
LRESULT CALLBACK MouseProc(int nCode,WPARAM wParam,LPARAM lParam)
{
return 0;<span style="white-space:pre"> </span>
}
LRESULT CALLBACK KeyboardProc(int nCode,WPARAM wParam,LPARAM lParam)
{
if(VK_F2 == wParam) //F2关闭
{
::SendMessageA(g_hwnd,WM_CLOSE,0,0);
::UnhookWindowsHookEx(::g_hKeyboard);
::UnhookWindowsHookEx(::g_hMouse);
}
return 0;
}
//安装鼠标钩子过程的函数
void SetHook( HWND hwnd )
{
::g_hwnd=hwnd; //这条赋值语句其实也可以写在应用程序的函数外
::g_hMouse=::SetWindowsHookExA(
WH_MOUSE,
::MouseProc,
::GetModuleHandleA("0712B.dll"), //安装钩子的DLL的模块句柄
0 //第四个参数设为0 全局钩子 所有进程
);
;
::g_hKeyboard=::SetWindowsHookExA(
WH_KEYBOARD,
::KeyboardProc,
::GetModuleHandleA("0712B.dll"),
0
);
;
}
进程运行后,即使在别的窗口(比如浏览器)下按F2,也会把exe给关了
风行者引领群雄者行风