今天因为业务需要封装了一个函数:
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;
}
问题解决