AutoCAD 3DMAX C语言 Pro/E UG JAVA编程 PHP编程 Maya动画 Matlab应用 Android
Photoshop Word Excel flash VB编程 VC编程 Coreldraw SolidWorks A Designer Unity3D
 首页 > VC编程

用Visual C++设计窗体探测器

51自学网 2015-08-30 http://www.wanshiok.com

最近心血来潮,对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不保证资料的完整性。
上一篇:VxD编程入门教程  下一篇:利用shell编程实现进程删除自身