最近心血来潮,对spy深感兴趣,便准备进行一次间谍行动,目标很简单,利用EnableWindow函数激活不可用或无效的控件按钮,当然,这窗体探测器是必不可少了,原以为很简单,但实际行动起来,却遇到不少麻烦,现将经过记录下来,供有兴趣的朋友参考。
我们大都见过spyxx中的窗体探测器,当鼠标在窗体探测器上按下左键时,更改鼠标样式,同时捕获鼠标,探测鼠标下的窗体直到鼠标左键松开。这样我们可以写出代码框架了:
case WM_LBUTTONDOWN://鼠标左键按下,检测拖动还是探测
{
MSG msg;
//在窗体探测器中按下鼠标
if(在窗体探测器内==TRUE)//替换光标,探测拖动
{
//更改鼠标样式
SetCursor(...);
//捕获鼠标
SetCapture(hWnd);
hWndNow=NULL;//当前窗体设为空//此为全局变量
//获取鼠标移动消息
while(GetMessage(&msg,NULL,WM_MOUSEFIRST,WM_MOUSELAST))
{
if((msg.message==WM_MOUSEMOVE)||(msg.message==WM_NCMOUSEMOVE))
{
HWND hWndPoint;
//设置光标
SetCursor(LoadCursor(hInst, (LPCTSTR)CUR_WINDOWSPY));
GetCursorPos(&Point);
//探测当前鼠标点
if(hWndPoint=WindowFromPoint(Point))
{
if(hWndNow!=hWndPoint)//目标已改变
{
if(hWndNow)
{
//清除旧目标上的黑框
XorBorder(hWndNow);
}
//并且不属于本线程
if(GetWindowThreadProcessId(hWndPoint,NULL)!=GetCurrentThreadId())
{
//将当前窗体画一黑边框
hWndNow=hWndPoint;
XorBorder(hWndNow);
}
else
{
hWndNow=NULL;
}
//显示窗体信息
ShowWindowMessage(hWnd,hWndNow);
}
}
else
{
hWndNow=NULL;
ShowWindowMessage(hWnd,hWndNow);
}
}
//如果左键松开,则跳出
else if(msg.message==WM_LBUTTONUP)
{
break;
}
}
XorBorder(hWndNow);
//释放鼠标并恢复鼠标样式
SetCursor(LoadCursor(NULL,(LPCTSTR)IDC_ARROW));
ReleaseCapture();
}
break;
}




