如何确定桌面上任何两个窗口的ZOrder关系

http://topic.csdn.net/t/20050612/18/4077073.html

struct   CWndNode 
{ 
HWND               m_hWnd; 
CWndNode   *   m_pPrev; 
CWndNode   *   m_pNext; 

CWndNode   (HWND   hWnd)   {   m_hWnd   =   hWnd;   m_pPrev   =   m_pNext   =   NULL;   }
}; 

void   DeleteWndLine   (CWndNode   *   pNode) 
{ 
ASSERT   (pNode   !=   NULL); 

CWndNode   *   pCur   =   pNode; 
while   (pCur-> m_pPrev) 
pCur   =   pCur-> m_pPrev; 

while   (pCur) 
{ 
CWndNode   *   pTemp   =   pCur; 
pCur   =   pCur-> m_pNext; 
delete   pTemp; 
} 
} 

 

BOOL CComputerOper::FindZOrder(HWND   hWndA,   HWND   hWndB) 
{ 
    ASSERT   (IsWindow(hWndA)); 
    ASSERT   (IsWindow(hWndB)); 
    ASSERT   (hWndA   !=   hWndB); 

    //   取两个窗口的顶级窗口 
    HWND     hTopA   =   hWndA; 
    HWND     hTopB   =   hWndB; 
    while   (GetParent(hTopA)   !=   NULL) 
        hTopA   =   GetParent(hTopA); 
    while   (GetParent(hTopB)   !=   NULL) 
        hTopB   =   GetParent(hTopB); 

    //   第一种情况:两个窗口分别属于不同的顶级窗口 
    if   (hTopA   !=   hTopB) 
    { 
        HWND   hCur     =   GetTopWindow(NULL); 
        while   (hCur   !=   NULL) 
        { 
            if   (hTopA   ==   hCur) 
                return   TRUE; 
            else   if   (hTopB   ==   hCur) 
                return   FALSE; 
            hCur   =   GetWindow(hCur,   GW_HWNDNEXT); 
        } 
    } 
    //   第二种情况:两个窗口属于同一个顶级窗口 
    else 
    { 
        //   建立   父-子窗口链   > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > 
        CWndNode   *   pWndLineA   =   new   CWndNode(hWndA); 
        CWndNode   *   pWndLineB   =   new   CWndNode(hWndB); 

        HWND   hTemp   =   hWndA; 
        while   (hTemp   !=   hTopA) 
        { 
            hTemp   =   GetParent(hTemp); 
            CWndNode   *   pTempNode   =   new   CWndNode(hTemp); 
            pTempNode-> m_pNext   =   pWndLineA; 
            pWndLineA-> m_pPrev   =   pTempNode; 
            pWndLineA   =   pTempNode; 
        } 

        hTemp   =   hWndB; 
        while   (hTemp   !=   hTopB) 
        { 
            hTemp   =   GetParent(hTemp); 
            CWndNode   *   pTempNode   =   new   CWndNode(hTemp); 
            pTempNode-> m_pNext   =   pWndLineB; 
            pWndLineB-> m_pPrev   =   pTempNode; 
            pWndLineB   =   pTempNode; 
        } 
        //   建立   父-子窗口链   < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < 

        //   查询同层窗口 
        while   (pWndLineA-> m_hWnd   ==   pWndLineB-> m_hWnd) 
        { 
            if   (pWndLineA-> m_pNext   ==   NULL   ||   pWndLineB-> m_pNext   ==   NULL) 
            //   此时出现特殊情况:其中一个窗口是另外一个窗口的父窗口 
            { 
                BOOL   res; 
                if   (pWndLineA-> m_pNext   ==   NULL)   //   A   是   B   的父窗口,即   B   在   A   的前面(子窗口总在父窗口前面) 
                res   =   FALSE; 
                else 
                res   =   TRUE; 
                DeleteWndLine   (pWndLineA); 
                DeleteWndLine   (pWndLineB); 
                return   res; 
            } 
            pWndLineA   =   pWndLineA-> m_pNext; 
            pWndLineB   =   pWndLineB-> m_pNext; 
        } 

        //   此时   pWndLineA-> m_hWnd   和   pWndLineB-> m_hWnd   位于同一层,可以比较他们的   Z   序了。 
        //   需要注意,此时   pWndLineA-> m_hWnd   不一定等于   hWndA 
        //                                 pWndLineB-> m_hWnd   不一定等于   hWndB 
        HWND   hA   =   pWndLineA-> m_hWnd; 
        HWND   hB   =   pWndLineB-> m_hWnd; 
        DeleteWndLine   (pWndLineA); 
        DeleteWndLine   (pWndLineB); 

        HWND   hCur     =   GetTopWindow   (GetParent(hA)); 
        while   (hCur   !=   NULL) 
        { 
            if   (hA   ==   hCur) 
            return   TRUE; 
            else   if   (hB   ==   hCur) 
            return   FALSE; 
            hCur   =   GetWindow   (hCur,   GW_HWNDNEXT); 
        } 
    } 

    TRACE0   ( "函数错误,FindZOrder   出现意外情况。 "); 
    ASSERT   (FALSE); 

    return   FALSE; 
} 

 

原文地址:https://www.cnblogs.com/carl2380/p/2648543.html