为什么我的WH_MOUSE不可以全局??

ghttzsqgm 2003-08-28 03:23:04
我的MouseHook.cpp简单介绍如下:
#pragma data_seg("TestData")
HWND glhPrevTarWnd=NULL;
HWND glhHook=NULL;
HINSTANCE glhInstance=NULL;
#pragma data_seg()

void StartHook(HWND hViewHwnd, HMODULE hMod)
{
m_hViewHandle = hViewHwnd;

glhHook=(HWND)SetWindowsHookEx(WH_MOUSE,MouseProc,hMod,0);

}

LRESULT WINAPI MouseProc(int nCode,WPARAM wParam,LPARAM lParam)
{
/*
LPMOUSEHOOKSTRUCT pMouseHook=(LPMOUSEHOOKSTRUCT) lParam;
if(nCode>=0)
{
*/
HWND glhTargetWnd=pMouseHook->hwnd;
//取目标窗口句柄
HWND ParentWnd=glhTargetWnd;
while(ParentWnd !=NULL)
{
glhTargetWnd=ParentWnd;
//取应用程序主窗口句柄
ParentWnd=GetParent(glhTargetWnd);
}
if(glhTargetWnd!=glhPrevTarWnd)
{
char szCaption[100];
//取目标窗口标题
GetWindowText(glhTargetWnd,szCaption,100);

SendMessage(m_hViewHandle, WM_CAPTION_CHANGED, 0, (LPARAM)szCaption);
}
}

//继续传递消息
return CallNextHookEx((HHOOK)glhHook,nCode,wParam,lParam);
}

为什么我的程序只在本程序窗口有效,而不是全局的?

而当我把WH_MOUSE换成WH_MOUSE_LL时,将MouseProc中相应部分换成
/*
LPMSLLHOOKSTRUCT pMouseHook = (LPMSLLHOOKSTRUCT )lParam;
if (nCode >= 0) {
HWND glhTargetWnd = WindowFromPoint(pMouseHook->pt);
/*
时,其他都一样。程序却可以正常进行。为什么?好奇怪啊。

哪位大侠指点一下?
...全文
233 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
aachenG 2003-08-30
  • 打赏
  • 举报
回复
http://pfans.html.533.net/program/win32/win32002.html

请参考这篇帖子,和你的程序功能一样,我刚编译了上面的代码,
可以hook到全局mouse。
从你给出的代码来看,这篇帖子里的和你的代码的区别是hMod不是
传进来的,而是在DllMain里通过 hMod = hInstance 得到的。
ghttzsqgm 2003-08-29
  • 打赏
  • 举报
回复
To :kernalandkernal(kernalandkernal)
可以解释清楚点吗?
如果这样的话,为什么我换成WH_MOUSE_LL就不影响了吗?


虽然没有看懂那篇文章,还是谢谢eastnofail(Char *)
litbox 2003-08-28
  • 打赏
  • 举报
回复
把 glhHook=(HWND)SetWindowsHookEx(WH_MOUSE,MouseProc,hMod,0);中的hMod改为dll的HINSTANCE看看?
eastnofail 2003-08-28
  • 打赏
  • 举报
回复
关于共享内存,你可以参考这个帖子:
http://expert.csdn.net/Expert/topic/1612/1612666.xml?temp=.5226099
kernalandkernal 2003-08-28
  • 打赏
  • 举报
回复
共享内存翻了严重的错误
ghttzsqgm 2003-08-28
  • 打赏
  • 举报
回复

TO:eastnofail(Char *)

我在def中申明如下了
SECTIONS
TestData READ WRITE SHARED

我刚才尝试了你的做法,也还是一样的结果。不知道为什么。
eastnofail 2003-08-28
  • 打赏
  • 举报
回复
WH_MOUSE_LL只能运行在Windows NT/2000/XP,他可以捕获到由Mouse_event产生的消息,并且只能做成全局钩子
zhouyong0371 2003-08-28
  • 打赏
  • 举报
回复
WH_MOUSE

WH_MOUSE_LL有什么区别?
eastnofail 2003-08-28
  • 打赏
  • 举报
回复
你使用共享内存不对,这样:
#pragma data_seg(".SHARE")
HWND glhPrevTarWnd=NULL;
HWND glhHook=NULL;
HINSTANCE glhInstance=NULL;
#pragma comment(linker, "/section:.SHARE,rsw")

15,471

社区成员

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

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