为什么无法得到一些游戏的子窗口和控件?
我的代码如下:
BOOL CALLBACK EnumWindowsProc( HWND hwnd,  LPARAM lParam )
{
CMyDlg *dlg=(CMyDlg *)lParam;
char wintext[Win_Text_Max_Len];
if(::IsWindowVisible(hwnd))
{
::GetWindowText(hwnd,wintext,Win_Text_Max_Len);
dlg->m_combowinCtrl.InsertString(dlg->m_combowinCtrl.GetCount(),wintext);//m_combowinCtrl为CComboBox对象
dlg->AllWindow.Add(hwnd);//AllWindow为CArray类的对象
}
return 1;
}void CMyDlg::OnBUTTONShuaXinWin() 
{
// TODO: Add your control notification handler code here
while(m_combowinCtrl.GetCount()>0)
{
m_combowinCtrl.DeleteString(0);
}
AllWindow.RemoveAll();
EnumWindows(EnumWindowsProc,(LPARAM)this);
}
BOOL CALLBACK EnumChildProc(HWND hwnd,LPARAM lParam)
{
CMyDlg *dlg=(CMyDlg *)lParam;
CString str;
char wintext[Win_Text_Max_Len];
LVITEM lvi;
lvi.mask=LVIF_IMAGE|LVIF_TEXT; str.Format("0x%08X",(DWORD)hwnd);
lvi.pszText=(LPTSTR)(LPCTSTR)(str);
lvi.iItem=dlg->m_listchildwinCtrl.GetItemCount();//
lvi.iSubItem=0;//
dlg->m_listchildwinCtrl.InsertItem(&lvi);//m_listchildwinCtrl为CListCtrl对象 ::GetClassName(hwnd,wintext,Win_Text_Max_Len);
lvi.iSubItem++;
lvi.pszText=wintext;
dlg->m_listchildwinCtrl.SetItem(&lvi); str=wintext;
lvi.iSubItem++;
::GetWindowText(hwnd,wintext,Win_Text_Max_Len);
lvi.pszText=wintext;
dlg->m_listchildwinCtrl.SetItem(&lvi); RECT rect;
::GetWindowRect(hwnd,&rect);
str.Format("L:%4d T:%4d R:%4d B:%4d ",rect.left,rect.top,rect.right,rect.bottom);
lvi.iSubItem++;
lvi.pszText=(LPTSTR)(LPCTSTR)(str);
dlg->m_listchildwinCtrl.SetItem(&lvi);
return 1;
}void CMyDlg::OnBUTTONShuaXinChildWin() 
{
// TODO: Add your control notification handler code here
m_listchildwinCtrl.DeleteAllItems();
if(m_combowinCtrl.GetCurSel()<0)
return;
EnumChildWindows(AllWindow[m_combowinCtrl.GetCurSel()],EnumChildProc,(LPARAM)this);
}

解决方案 »

  1.   

    为了优化速度提供效率,很多游戏里的按钮和子窗口都不是真正windows概念上的窗口,而是一幅图片或是其他什么的。所以你抓不到
      

  2.   

    基本如楼上所说,而且这些开发的厂商一般有自己的引擎,你感觉是窗口,但实际是位图或其他图片格式,只不过是由那个引擎判断你的鼠标是否在位图的rect内,并且处理所有窗口消息,换句话说,所有的消息都是引擎来处理,并没有交给像CWnd::OnMouseMove之类的默认处理,所以并没有创建窗口,你用枚举窗口的方法自然得不到了