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 = 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;

}

问题解决

         


你可能感兴趣的:(GetWindowText 卡死)