鼠标钩子的问题在窗口内是可以获得鼠标位置出了窗口就不行了

yaleond 2009-05-19 02:39:48
自己写了个鼠标的全局DLL钩子,相关代码如下:
#include<windows.h>

HINSTANCE m_hDLL;
HHOOK m_hhookDll;
HWND m_hWnd; //调用DLL的窗口句柄
MOUSEHOOKSTRUCT* mhookstruct;

BOOL WINAPI DllMain(
HINSTANCE hinstDLL,
DWORD fdwReason,
LPVOID lpvReserved
)
{
switch(fdwReason)
{
case DLL_PROCESS_ATTACH:
m_hDLL = hinstDLL;
break;
case DLL_THREAD_ATTACH:
break;
case DLL_THREAD_DETACH:
break;
case DLL_PROCESS_DETACH:
UnhookWindowsHookEx(m_hhookDll);
}
return true;
}

LRESULT CALLBACK MouseProc(int nCode,
WPARAM wParam,
LPARAM lParam
)
{
if(wParam == WM_MOUSEMOVE)
{
mhookstruct = (MOUSEHOOKSTRUCT*)lParam;
PostMessage(m_hWnd,WM_MOUSEMOVE,0,MAKELPARAM((mhookstruct->pt).x,(mhookstruct->pt).y ));
return 1;
}
else
{
if(wParam == WM_LBUTTONDOWN )
{
mhookstruct = (MOUSEHOOKSTRUCT*)lParam;
PostMessage(m_hWnd,WM_LBUTTONDOWN ,0,MAKELPARAM(mhookstruct->pt.x,mhookstruct->pt.y));

return 1;
}
}
return CallNextHookEx(m_hhookDll,nCode,wParam,lParam);
}


void _stdcall setHook(HWND hWnd)
{
m_hWnd = hWnd;
m_hhookDll = SetWindowsHookEx(WH_MOUSE,MouseProc,m_hDLL,0);
return;
}

再写个程序去获取的时候却只能在窗口之类获取到,出了本窗口就获取不到了...l
...全文
104 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
NineheadedBird 2009-05-20
  • 打赏
  • 举报
回复
我的写法
static LRESULT CALLBACK hookproc(UINT nCode, WPARAM wParam, LPARAM lParam)
{
if (nCode < 0)
{
// pass it on
CallNextHookEx(hook, nCode, wParam, lParam);
}

LPMSG msg = (LPMSG)lParam;
if (msg->message == WM_MOUSEMOVE || msg->message == WM_NCMOUSEMOVE || msg->message == WM_LBUTTONDOWN || msg->message == WM_LBUTTONUP)
{
unsigned long currentKeyMouseTime = timeGetTime();
unsigned long difftime = currentKeyMouseTime - oldKeyMouseTime;
if (difftime > 20) // up to 50 frames per second
{
HCURSOR hcur = GetCursor();
PostMessage(hWndServer, WM_USER_SAVECURSOR_MSG, (unsigned int)hcur, msg->message);
oldKeyMouseTime = currentKeyMouseTime;
}
}

return CallNextHookEx(hook, nCode, wParam, lParam);
}

WM_USER_SAVECURSOR_MSG 是我自己注册消息
yaleond 2009-05-19
  • 打赏
  • 举报
回复
SetWindowsHookEx(WH_MOUSE_LL...
然后SetCursorPos下,发现是可以的,但是为什么WH_MOUSE_LL可以而WH_MOUSEMOVE不行呢?
yaleond 2009-05-19
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 NineheadedBird 的回复:]
我也是抓鼠标位置 用的 WH_GETMESSAGE 成功了 你试试吧
同时关注你的问题-_-
[/Quote]
我试了下,还是不行,可以把你的源码给我看看不(钩子的还有调用这钩子的(我怀疑是不是这里的有问题))?不胜感激!
yaleond 2009-05-19
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 oyljerry 的回复:]
SetWindowsHookEx(WH_MOUSE_LL...
[/Quote]
用WH_MOUSE_LL的话鼠标会不动的...我用过
NineheadedBird 2009-05-19
  • 打赏
  • 举报
回复
我也是抓鼠标位置 用的 WH_GETMESSAGE 成功了 你试试吧
同时关注你的问题-_-
oyljerry 2009-05-19
  • 打赏
  • 举报
回复
用 SetWindowsHookEx(WH_MOUSE_LL...
LeviZhou 2009-05-19
  • 打赏
  • 举报
回复
关注一下,帮顶

15,471

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 进程/线程/DLL
社区管理员
  • 进程/线程/DLL社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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