子窗口的识别方法,VC中判断指定窗口是否被其他窗口遮挡

 操作系统     |      2020-01-26 13:50

本来计划利用窗口类型分辨子窗口:

   本来是想看清当前窗口是不是在最前方,无助措施用尽就是非常,于是想换个思路:推断钦赐窗口是或不是被此外窗口遮挡。然后掘网三尺,找到了这几个:

第蓬蓬勃勃找到你要枚举的主窗口  
  HWND   hWnd   =  ::FindWindow(NULL,"**"); 
  再枚举它的全部子窗口:  
  HWND   hChildWnd   =   ::GetWindow(hWnd,   GW_CHILD);  
  while(   hChildWnd!=NULL   )  
  {  
        //   在这里间取子窗口的风格style  
        style=:: (childhwnd,GWL_STYLE卡塔尔国; // 获得有关钦赐窗口的音信,GWL_STYLE:获得窗口作风

bool CTestTray2Dlg::IsCoveredByOtherWindow(HWND hWnd)
{
 RECT rcTarget; 
 ::GetWindowRect(hWnd, &rcTarget);

   
        //  
        hChildWnd   =   ::GetWindow(hChildWnd,   GW_HWNDNEXT);  
  }

 bool isChild = (WS_CHILD == (::GetWindowLong(hWnd, GWL_STYLE) & WS_CHILD));

唯独发现多个会话框中或许由众三个豆蔻年华律风格的子窗口于是选用控件ID 识别

 if (::GetDesktopWindow() == hWnd)
  hWnd = ::GetWindow(::GetTopWindow(hWnd), GW_HWNDLAST);

首先找到您要枚举的主窗口  
  HWND   hWnd   =  ::FindWindow(NULL,"**"); 
  再枚举它的全部子窗口:  
  HWND   hChildWnd   =   ::GetWindow(hWnd,   GW_CHILD);  
  while(   hChildWnd!=NULL   )  
  {  
        //   在这里边取子窗口的控件ID  
        int   nID   =   ::GetDlgCtrlID(hChildWnd);  
        //  
        hChildWnd   =   ::GetWindow(hChildWnd,   GW_HWNDNEXT);  
  }

 do{ 
  HWND hCurWnd = hWnd;

  while(NULL != (hWnd = ::GetNextWindow(hWnd, GW_HWNDPREV))){ 
   if (::IsWindowVisible(hWnd)){ 
    RECT rcWnd; 
    ::GetWindowRect(hWnd, &rcWnd);

    if(!((rcWnd.right < rcTarget.left) || (rcWnd.left > rcTarget.right) || 
     (rcWnd.bottom < rcTarget.top) || (rcWnd.top > rcTarget.bottom))){ 
     return true; 
    } 
   } 
  }