大虾们请过来看看,又有疑难杂症了,来诊断诊断吧
我创建一个系统鼠标钩子在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;
}
}
********************************
但是为什么当鼠标移出对话框时鼠标停下,本应小窗口应该移到鼠标停下的位置。但其实并没有实现,这是为什么?但当鼠标在对话框内,能达到这种效果说明,这个程序并没有完全失败,但究竟问题出在那里呢?谢谢指教!