大虾们请过来看看,又有疑难杂症了,来诊断诊断吧

litsnake1 2002-05-16 12:12:54
我创建一个系统鼠标钩子在mshook.dll中,一个主程序test.exe;
在dll中有生成一个新的小窗口,希望当鼠标停下时,就把这个小窗口移到鼠标停下的位置。我的主程序是一个对话框,只有鼠标在这个主程序的对话框之内,能达到这个效果,但当鼠标移出对话框时停下来时,哪个小窗口就不动了,还是停在对话框之内,也就是说,哪个小窗口总是不大离开对话框范围。这是为什么?
下面是我的一部分代码请帮我看看:
//这是在dll中;这是系统鼠标钩子
LRESULT CALLBACK MouseProc(int nCode,WPARAM wParam,LPARAM lParam)
{
passtime=0;
if (nCode<0)
return CallNextHookEx(hHook,nCode,wParam,lParam);
if (wParam==WM_MOUSEMOVE)
{

mPt=(MOUSEHOOKSTRUCT *)lParam;
MousePoint.x=mPt->pt.x;
MousePoint.y=mPt->pt.y;

}
return CallNextHookEx(hHook,nCode,wParam,lParam);
}
//生成一个小窗口,这个小窗口是在主程序中注册窗口类的
void createwin(HINSTANCE hInstance)
{
globalhwnd1=CreateWindowEx(
WS_EX_TOPMOST,
MOUSE_POINT_WINDOW,
MOUSE_POINT_WINDOW,
WS_CLIPSIBLINGS | WS_POPUP ,
0, 0, 50,6,
NULL,
NULL,
hInstance,
NULL);
if (globalhwnd1==NULL)
{
MessageBox(0," createwin Error!","error",MB_OK);
return;
}
UINT nID = ::SetTimer(globalhwnd1, HOOK_TIMER, 500, TimerProc);
if (nID<0)
return;
ShowWindow(globalhwnd1,SW_SHOW);
UpdateWindow(globalhwnd1);
}
//这是小窗口的窗口函数
LRESULT CALLBACK MouseWndProc(HWND hWnd, UINT Message,
WPARAM wParam, LPARAM lParam)
{
switch(Message)
{
case WM_CLOSE:
{
DestroyWindow(hWnd);
PostQuitMessage(0);
}
break;
default:
{
return DefWindowProc(hWnd, Message, wParam, lParam);
}
}
return 0L;
}
//这是定时器
void CALLBACK TimerProc(HWND hwnd, UINT msg, UINT idTimer, DWORD dwTime)
{
globalhwnd2=WindowFromPoint(MousePoint);
if (globalhwnd2==NULL)
MessageBox(0,"globalhwnd2 error","error",MB_OK);
if (passtime==-1) //当passtime=-1时,是由于在这个点上已经抓过词了,避免重复抓词
return;
passtime+=1;
if ((passtime>=2)&&(passtime<5)) //说明鼠标停在某处已经超过一秒了,就把小窗口移到鼠标位置上
{
SetWindowPos(globalhwnd1,HWND_TOPMOST,MousePoint.x,MousePoint.y,30,4,SWP_NOACTIVATE | SWP_SHOWWINDOW);
ShowWindow(globalhwnd1, SW_SHOW);
passtime=7;
}
}
********************************

但是为什么当鼠标移出对话框时鼠标停下,本应小窗口应该移到鼠标停下的位置。但其实并没有实现,这是为什么?但当鼠标在对话框内,能达到这种效果说明,这个程序并没有完全失败,但究竟问题出在那里呢?谢谢指教!



...全文
10 点赞 收藏 8
写回复
8 条回复
切换为时间正序
当前发帖距今超过3年,不再开放新的回复
发表回复
litsnake1 2002-05-21
大家来谈谈吧!
回复
litsnake1 2002-05-21
up
回复
litsnake1 2002-05-18
应该如何使那个小窗口变成Desktop的child,
是这样吗:
globalhwnd1=CreateWindowEx(
WS_EX_TOPMOST,
MOUSE_POINT_WINDOW,
MOUSE_POINT_WINDOW,
WS_CLIPSIBLINGS | WS_POPUP ,
0, 0, 50,6,
GetDesktopWindow(),
NULL,
hInstance,
NULL);
这样是不是生成的窗口就是DesktopWindow的child。
回复
zdhe 2002-05-17
for a good hook, use pragma is good.

to fulfil you request , you should create your tip windows (little window) as the child of GetDesktopwindow,
if you set other or null, main windows will be used.

all child display area can not exceed parent window. -> it's rule.

desktop windows is wide most.

回复
litsnake1 2002-05-17
to kingzai():
我知道这是共享段,但是我想知道你定义这个鼠标钩子句柄作用是什么?
也就是说我在程序中那里能用得上?而且我也想知道我的程序的问题出现在那里?
麻烦您帮我说说好吗,谢谢了!
回复
kingzai 2002-05-16
这是设置共享代码段:hHook为你的鼠标钩子句柄,你把我这段加在程序的头部
回复
litsnake1 2002-05-16
楼上的大虾能不能说的详细一点,什么意思?
static HHOOK hHook=NULL;
重中的hHook变量是什么用途?
回复
kingzai 2002-05-16
you must define hook handle like this
#pragma data_seg(".SHARDAT")
static HHOOK hHook=NULL;
#pragma data_seg()
回复
相关推荐
发帖
VC/MFC
创建于2007-09-28

1.5w+

社区成员

VC/MFC相关问题讨论
申请成为版主
帖子事件
创建了帖子
2002-05-16 12:12
社区公告

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