setwindowshookex卸载后再次调用失败

scriptkit 2007-05-08 06:23:57
我在dll中(扩展的dll)调用了setwindowshookex函数,后用UnhookWindowsHookEx正确.
但是当我再次调用setwindowshookex时,却返回错误,请问这是怎么回事?
...全文
456 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
scriptkit 2007-05-09
  • 打赏
  • 举报
回复
顶上去啊.呵呵
scriptkit 2007-05-09
  • 打赏
  • 举报
回复
但我有点不明白,为什么调用第二次的时候glhInstance会变化呢?
从哪里开始变的啊?
scriptkit 2007-05-09
  • 打赏
  • 举报
回复
谢谢.我是
#pragma data_seg(".sharedata")
HHOOK glhHook=NULL; //钩子句柄。
HINSTANCE glhInstance=NULL; //DLL实例句柄。
#pragma data_seg()

把HINSTANCE glhInstance=NULL;共享了,发现调用第二次的时候glhInstance变化了.
我把glhInstance做全局函数,不放共享段里也就OK了.
你的方法
glhInstance=::GetModuleHandle("DllFileName.dll");
是最好的..但不能放构造函数,因为他还会变,每次调用start()都重新获取句柄是最好的.
谢谢..
StarManJhh 2007-05-09
  • 打赏
  • 举报
回复
问题就在你的动态库句柄上面.不要在DllMain函数中取动态库句柄,那样不安全.

改一下代码:

//安装全局钩子。
HHOOK CKeyHook::Start()
{
    glhInstance=::GetModuleHandle("DllFileName.dll");//这样取动态库句柄,什么时候都没问题.你可以把这句放到CKeyHook的构造函数中.

glhHook = SetWindowsHookEx(WH_KEYBOARD,KeyboardProc,glhInstance,0);//设置键盘钩子。
return glhHook;
}
scriptkit 2007-05-09
  • 打赏
  • 举报
回复

DLL中的代码..
#include "stdafx.h"
#include <afxdllx.h>
#include "CQhook.h"

#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif

//Shared data section
#pragma data_seg(".sharedata")
HHOOK glhHook=NULL; //钩子句柄。
HINSTANCE glhInstance=NULL; //DLL实例句柄。
#pragma data_seg()



static AFX_EXTENSION_MODULE CQhookDLL = { NULL, NULL };


extern "C" LRESULT WINAPI KeyboardProc(int nCode,WPARAM wParam,LPARAM lParam)
{
if( nCode >= 0 )
{
if( wParam == 0X79 )//当按下F10键时,激活外挂。
{
//外挂实现代码。
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_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()
{
glhHook = SetWindowsHookEx(WH_KEYBOARD,KeyboardProc,glhInstance,0);//设置键盘钩子。
return glhHook;
}
//卸载全局钩子。
BOOL CKeyHook::Stop()
{
BOOL bResult = TRUE;
if( glhHook )
bResult = UnhookWindowsHookEx(glhHook);//卸载键盘钩子。
if (bResult)
{
glhHook=NULL;
}

return bResult;
}

extern "C" int APIENTRY
DllMain(HINSTANCE hInstance, DWORD dwReason, LPVOID lpReserved)
{
// Remove this if you use lpReserved
UNREFERENCED_PARAMETER(lpReserved);

if (dwReason == DLL_PROCESS_ATTACH)
{
TRACE0("CQHOOK.DLL Initializing!\n");

// Extension DLL one-time initialization
if (!AfxInitExtensionModule(CQhookDLL, hInstance))
return 0;
new CDynLinkLibrary(CQhookDLL);
glhInstance = hInstance;
}
else if (dwReason == DLL_PROCESS_DETACH)
{
TRACE0("CQHOOK.DLL Terminating!\n");
// Terminate the library before destructors are called
AfxTermExtensionModule(CQhookDLL);
}
return 1; // ok
}


调用程序的代码.

void CSimulateDlg::OnButton1()
{
// TODO: Add your control notification handler code here
if( !bSetup )
{
m_hook.Start();//激活全局钩子。
}
else
{
m_hook.Stop();//撤消全局钩子。
}
bSetup = !bSetup;
}

第一次成功,但撤消钩子后,再次点按钮钩子不行啊...谁帮帮我啊
StarManJhh 2007-05-08
  • 打赏
  • 举报
回复
问题可能在setwindowshookex的参数上,关键是后两个参数,一个是DLL的句柄,一个是调用线程的ID。HOOK函数的实现在EXE文件中还是DLL中?请说的详细一点好么?

16,472

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Web++
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

试试用AI创作助手写篇文章吧