最近心血来潮,对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; }
这里的问题就在 WindowFromPoint 和 XorBorder 中.这里我们先看第一版XorBorder:
void XorBorder(HWND hWnd) { RECT rect; //当前窗体区域 HDC hdc=GetWindowDC(hWnd); GetWindowRect(hWnd,&rect); //调整边框 rect.bottom-=rect.top; rect.right-=rect.left; rect.left=rect.top=0; SetROP2(hdc,R2_NOT); FrameRect(hdc,&rect,GetStockObject(BLACK_BRUSH)); ReleaseDC(hWnd,hdc); } <  
说明:本教程来源互联网或网友上传或出版商,仅为学习研究或媒体推广,wanshiok.com不保证资料的完整性。
1/2 1 2 下一页 尾页 |