钩子的DLL:
#pragma data_seg("shareddata")
HHOOK glhHook=NULL; //钩子句柄。
HINSTANCE glhInstance=NULL; //DLL实例句柄。
#pragma data_seg()
//-------------------------------
//键盘钩子处理函数。
extern "C" LRESULT WINAPI KeyboardProc(int nCode,WPARAM wParam,LPARAM lParam)
{
//if( nCode >= 0 )
//{
//BYTE ctrl = HIBYTE(GetKeyState(VK_HOME));
///if(ctrl)//当按下HOME键时,激活外挂。
if(wParam == VK_HOME)
{//外挂实现代码
//MessageBox(NULL,"hook","",MB_OK);
CPoint newPoint,oldPoint;
GetCursorPos(&oldPoint);
newPoint.x = oldPoint.x+40;
newPoint.y = oldPoint.y+10;
SetCursorPos(newPoint.x,newPoint.y);
mouse_event(MOUSEEVENTF_LEFTDOWN,0,0,0,0);//模拟按下鼠标左键。
mouse_event(MOUSEEVENTF_MOVE,30,30,0,0);
mouse_event(MOUSEEVENTF_MOVE,50,20,0,0);
mouse_event(MOUSEEVENTF_LEFTUP,0,0,0,0);//模拟放开鼠标左键。
//keybd_event(VK_SHIFT,MapVirtualKey(VK_SHIFT,0),0,0); //按下SHIFT键。
//keybd_event(0x52,MapVirtualKey(0x52,0),0,0);//按下R键。
//keybd_event(0x52,MapVirtualKey(0x52,0),KEYEVENTF_KEYUP,0);//放开R键。
//keybd_event(VK_SHIFT,MapVirtualKey(VK_SHIFT,0),KEYEVENTF_KEYUP,0);//放开SHIFT键。
SetCursorPos(oldPoint.x,oldPoint.y);
}
//}
return CallNextHookEx(glhHook,nCode,wParam,lParam);
}
CKeyHook::CKeyHook(){}
CKeyHook::~CKeyHook()
{
if( glhHook )Stop();
}//安装全局钩子。
HHOOK CKeyHook::Start()
{
MessageBox(NULL,"start hook","",MB_OK);
glhHook = SetWindowsHookEx(WH_KEYBOARD,KeyboardProc,glhInstance,0);//设置键盘钩子。
return glhHook;
}//卸载全局钩子。
BOOL CKeyHook::Stop(){ BOOL bResult = TRUE;
if( glhHook )bResult = UnhookWindowsHookEx(glhHook);
//卸载键盘钩子。
MessageBox(NULL,"shut down hook","",MB_OK);
return bResult;
} //-------------------------------static AFX_EXTENSION_MODULE ActiveKeyDLL = { NULL, NULL };extern "C" int APIENTRY
DllMain(HINSTANCE hInstance, DWORD dwReason, LPVOID lpReserved)
{//如果使用lpReserved参数则删除下面这行
//UNREFERENCED_PARAMETER(lpReserved);
if (dwReason == DLL_PROCESS_ATTACH)
{
TRACE0("NOtePadHOOK.DLL Initializing!\n");//扩展DLL仅初始化一次
if (!AfxInitExtensionModule(ActiveKeyDLL, hInstance))return 0;
new CDynLinkLibrary(ActiveKeyDLL);//把DLL加入动态MFC类库中
glhInstance = hInstance;//插入保存DLL实例句柄
}
else if (dwReason == DLL_PROCESS_DETACH)
{
TRACE0("NotePadHOOK.DLL Terminating!\n");//终止这个链接库前调用它
AfxTermExtensionModule(ActiveKeyDLL);
}return 1;
}
然后是启动关闭钩子的程序:
void CSimulateDlg::OnButton1()
{
// TODO: Add your control notification handler code here
if(!bSetup)
{
m_hook.Start();//激活全局钩子
//MessageBox("simulate","",MB_OK);
}
else
{
m_hook.Stop();//撤消全局钩子
}
bSetup = !bSetup;
}
论坛不能发工程,不知道以上代码能否说明问题,不然的话可以回贴或者+Q99859454看看工程,高分,非常感谢!
#pragma data_seg("shareddata")
HHOOK glhHook=NULL; //钩子句柄。
HINSTANCE glhInstance=NULL; //DLL实例句柄。
#pragma data_seg()
//-------------------------------
//键盘钩子处理函数。
extern "C" LRESULT WINAPI KeyboardProc(int nCode,WPARAM wParam,LPARAM lParam)
{
//if( nCode >= 0 )
//{
//BYTE ctrl = HIBYTE(GetKeyState(VK_HOME));
///if(ctrl)//当按下HOME键时,激活外挂。
if(wParam == VK_HOME)
{//外挂实现代码
//MessageBox(NULL,"hook","",MB_OK);
CPoint newPoint,oldPoint;
GetCursorPos(&oldPoint);
newPoint.x = oldPoint.x+40;
newPoint.y = oldPoint.y+10;
SetCursorPos(newPoint.x,newPoint.y);
mouse_event(MOUSEEVENTF_LEFTDOWN,0,0,0,0);//模拟按下鼠标左键。
mouse_event(MOUSEEVENTF_MOVE,30,30,0,0);
mouse_event(MOUSEEVENTF_MOVE,50,20,0,0);
mouse_event(MOUSEEVENTF_LEFTUP,0,0,0,0);//模拟放开鼠标左键。
//keybd_event(VK_SHIFT,MapVirtualKey(VK_SHIFT,0),0,0); //按下SHIFT键。
//keybd_event(0x52,MapVirtualKey(0x52,0),0,0);//按下R键。
//keybd_event(0x52,MapVirtualKey(0x52,0),KEYEVENTF_KEYUP,0);//放开R键。
//keybd_event(VK_SHIFT,MapVirtualKey(VK_SHIFT,0),KEYEVENTF_KEYUP,0);//放开SHIFT键。
SetCursorPos(oldPoint.x,oldPoint.y);
}
//}
return CallNextHookEx(glhHook,nCode,wParam,lParam);
}
CKeyHook::CKeyHook(){}
CKeyHook::~CKeyHook()
{
if( glhHook )Stop();
}//安装全局钩子。
HHOOK CKeyHook::Start()
{
MessageBox(NULL,"start hook","",MB_OK);
glhHook = SetWindowsHookEx(WH_KEYBOARD,KeyboardProc,glhInstance,0);//设置键盘钩子。
return glhHook;
}//卸载全局钩子。
BOOL CKeyHook::Stop(){ BOOL bResult = TRUE;
if( glhHook )bResult = UnhookWindowsHookEx(glhHook);
//卸载键盘钩子。
MessageBox(NULL,"shut down hook","",MB_OK);
return bResult;
} //-------------------------------static AFX_EXTENSION_MODULE ActiveKeyDLL = { NULL, NULL };extern "C" int APIENTRY
DllMain(HINSTANCE hInstance, DWORD dwReason, LPVOID lpReserved)
{//如果使用lpReserved参数则删除下面这行
//UNREFERENCED_PARAMETER(lpReserved);
if (dwReason == DLL_PROCESS_ATTACH)
{
TRACE0("NOtePadHOOK.DLL Initializing!\n");//扩展DLL仅初始化一次
if (!AfxInitExtensionModule(ActiveKeyDLL, hInstance))return 0;
new CDynLinkLibrary(ActiveKeyDLL);//把DLL加入动态MFC类库中
glhInstance = hInstance;//插入保存DLL实例句柄
}
else if (dwReason == DLL_PROCESS_DETACH)
{
TRACE0("NotePadHOOK.DLL Terminating!\n");//终止这个链接库前调用它
AfxTermExtensionModule(ActiveKeyDLL);
}return 1;
}
然后是启动关闭钩子的程序:
void CSimulateDlg::OnButton1()
{
// TODO: Add your control notification handler code here
if(!bSetup)
{
m_hook.Start();//激活全局钩子
//MessageBox("simulate","",MB_OK);
}
else
{
m_hook.Stop();//撤消全局钩子
}
bSetup = !bSetup;
}
论坛不能发工程,不知道以上代码能否说明问题,不然的话可以回贴或者+Q99859454看看工程,高分,非常感谢!
判断 hook 状态if(hook)
{}
g_hhook =SetWindowsHookEx(WH_KEYBOARD,KeyboardProc,glhInstance,0);
bOk = (g_hhook != NULL);
// Can't uninstall if not installed
BOOL bResult=FALSE;
if(g_hhook)
{
bResult= UnhookWindowsHookEx(g_hhook);
if(bResult)
g_hhook=NULL;
}
}
[in] Handle to the DLL containing the hook procedure pointed to by the lpfn parameter. The hMod parameter must be set to NULL if the dwThreadId parameter specifies a thread created by the current process and if the hook procedure is within the code associated with the current process.既然是全局钩子,glhInstance直接写0即可