GetWindowText 卡死

今天由於業務須要封裝了一個函數:
windows

int GenHwndByTitle(CString title,vector<HWND>& hwnds){函數

    int nCount = 0;spa

    // 得到首個handle.  調試

    HWND h = FindWindow(0,0);  orm

    // 循環查找直到找到爲給定進程ID的窗口句柄  進程

    while( h != NULL)  get

    {  it

        //檢查窗口句柄是否爲頂級窗口  循環

        if( ::GetParent(h) == NULL )  top

        {  

           tchar text[255];  

            ::GetWindowText(h,text,255);  

            CString str = CString(text);

            if ( str == title )

            {

                nCount++;

            }

            //有的有窗口 但無標題  

            /*if (strlen(text)>1)  

            {  

                printf("hwnd[%s]\n",text);  

            }  */

        }  

        // 取下一個窗口的句柄  

        //h = GetWindow(h, GW_HWNDNEXT);  

   h = GetWindow(h, GW_HWNDNEXT);          

}

    return nCount;

}

而後調試的時候發現死機了。(無響應,),後來查了下卡在了GetWindowText這裏。

緣由網上有不少:

    // 會卡機,有多是獲取自身窗體標題會卡住。。系統無線等待。。死鎖了。

解決辦法:

//https://msdn.microsoft.com/en-us/library/windows/desktop/ms633523(v=vs.85).aspx

使用新API:InternalGetWindowText替換GetWindowText


就像下面這樣

//經過窗口獲取句柄

int GenHwndByTitle(CString title,vector<HWND>& hwnds){

    int nCount = 0;

    // 得到首個handle.  

    HWND h = FindWindow(0,0);  

    // 循環查找直到找到爲給定進程ID的窗口句柄  

    while( h != NULL)  

    {  

        //檢查窗口句柄是否爲頂級窗口  

        if( ::GetParent(h) == NULL )  

        {  

            TChar text[255];  

            ::GetWindowText(h,text,255);  

            CString str = CString(text);

            if ( str == title )

            {

                nCount++;

            }

            //有的有窗口 但無標題  

            /*if (strlen(text)>1)  

            {  

                printf("hwnd[%s]\n",text);  

            }  */

        }  

        // 取下一個窗口的句柄  

        //h = GetWindow(h, GW_HWNDNEXT);  

   h = InternalGetWindow(h, GW_HWNDNEXT);          

}

    return nCount;

}

問題解決

相關文章
相關標籤/搜索