完全遮挡的意思就是屏幕上完全看不到该窗体
注意该窗体Visible为True
这里说的窗体值Window不限于Form,包括按钮、输入框等等等等bool Calc(IntPtr AHandle)
{
    { TODO : 判断句柄为AHandle的窗体是否被完全遮挡 }
}需要考虑各种复杂的情况--窗体包括不规则形状、还有被半透明窗体遮挡也算可见不知道有没有现成的API方法可用,提供线索或思路即可,有可调式代码更佳谢谢关注

解决方案 »

  1.   

    有个思路 不过不知道用哪个api
    先通过hwnd获得该控件的矩形区域,
    在取矩形区域是否有控件的hwnd2 然后比较,类似于spy++的实现
      

  2.   

    窗体规则不规则到不用考虑,在windows中他们都是Rect只是部分部位可能不可见罢了
      

  3.   

    {获取光标的位置}
        GetCursorPos(MousePoint);
        Curwindow:=WindowFromPoint(MousePoint);
        {获得光标所有者的线程ID}
        GetWindowThreadProcessId(Curwindow, @dwThreadID);
        {获取路径}
         if dwThreadID<>0 then
          begin
          hWindow:= OpenProcess(PROCESS_ALL_ACCESS,false,dwThreadID);
            if hWindow<>0 then
              begin
               if  EnumProcessModules(hWindow,@hMod,sizeof(hMod),cbNeeded)  then
                 begin
                 SetLength(FilePatch, MAX_PATH);
                 iLen := GetModuleFileNameEx(hWindow, hMod, PCHAR(FilePatch),  MAX_PATH);
                     if  iLen  <>  0  then
                         begin
                          SetLength(FilePatch,  StrLen(PCHAR(FilePatch)));
                          PatchEdit.Text:=FilePatch;
                         end;
                 end;
                 CloseHandle(hWindow);
              end;
          end;
        {存储窗口坐标的结构体的地址}
        GetWindowRect(Curwindow,hRect);
        GetWindowRect(PrevWindow,OldhRect);
      

  4.   

    每个窗体都有一个Region,类似于点的集合.只需用一算法判斷一个窗体是否完全包含另一个窗体即可.
      

  5.   

    这就要使用FindWindow首先获取所有的窗口,然后一个循环,对每个窗口的位置(也有一个API,大概是GetWindowInfo吧?存疑)和指定窗口的显示区域判断,再然后可判断两个窗口的Z轴位置(这个API我没用过,在C#中有这个概念,Z轴坐标是独立与XY的第三个坐标轴,相当于层面的意思)。
      

  6.   

    列举桌面上的所有可见的窗体,然后用每个窗体的Region组成一个GraphicsPath,然后用给定的窗体的Region来比较看一下是否完全被这个GraphicsPath包含了.
      

  7.   

    列举桌面上的所有可见的窗体,然后用每个窗体的Region组成一个GraphicsPath,然后用给定的窗体的Region来比较看一下是否完全被这个GraphicsPath包含了.
    --------
    这样如何判断谁在上谁在下?
      

  8.   

    我想的是一个变态的方法,强制刷新一个窗体,然后判断该窗体是否执行了Paint
    这个方法不是很通用,对于其他进程的窗体判断就很麻烦,贴出来扩展思路用private bool WindowPaint = false;
    private void button1_Click(object sender, EventArgs e)
    {
        PaintEventHandler vPaintEventHandler = new PaintEventHandler(window_Paint);
        button2.Paint += vPaintEventHandler;
        WindowPaint = false;
        button2.Invalidate();
        Application.DoEvents();
        button2.Paint -= vPaintEventHandler;
        Text = WindowPaint.ToString();
    }void window_Paint(object sender, PaintEventArgs e)
    {
        WindowPaint = true;
    }
      

  9.   

    用WindowFromPoint();把窗体的区域全搜索一遍那估计也可以,不过这个方法太慢(如果判断的窗体句柄是桌面,那就得扫描1024*768次?),也判断不出被半透明的窗体遮挡的情况
      

  10.   

    GetWindowRect  取目标hwnd的Rect
    取Rect内任意一点
    用上面的代码判断这点内的控件的hwnd,和Rect  比较hwnd和Rect
      

  11.   

    WindowFromPoint函数,把窗口的所有的点都作一边,只要取得窗口句柄和目标窗口的一样,就说明没被挡住,否则就是被挡住鸟。虽然慢了一点,也是一种方法。
      

  12.   

    强制刷新,然后判断该窗体是否执行了Paint你试过对本程序内部,如果完全遮挡则不执行Paint么?也许是执行了Paint但是在一个if语句以后就return呢?
    使我想到一个事,Windows是如何判断什么时候该执行此窗体的Paint的呢? 如果这个判断的过程我们假设可以拿到,也许问题就有望在这一步解决掉。这个判断的某一步我们可以通过API得到就好了,不过首先是到底是否存在这个判断过程。,
      

  13.   

    crossrowman(godi) ( ) 信誉:100    Blog   加为好友  2007-05-10 00:04:06  得分: 0   
     枚举所有的窗口
       判断窗口是否可见,如果可见,计算窗口跟目标窗口的重叠区域
    当所有窗口枚举完毕后,计算重叠区域是否完全覆盖了目标窗口这样不行的,如果目标窗体在最上面,后面有个大大的窗体完全包含了目标窗体的整个区域,同样是成立的,但此时目标窗体并没有被遮挡
      
     
      

  14.   

    简单点的方法
    Invalidate一下,如果没有产生OnPaint事件就是看不见的。