今天由於業務須要封裝了一個函數:
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;
}
問題解決