为什么无法得到某些窗口上的控件

PDD123 2006-09-05 04:44:30
为什么无法得到一些游戏的子窗口和控件?
我的代码如下:
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);
}
...全文
212 3 打赏 收藏 转发到动态 举报
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
PDD123 2006-09-05
  • 打赏
  • 举报
回复
恩,明白了,我猜也是。
palmax 2006-09-05
  • 打赏
  • 举报
回复
基本如楼上所说,而且这些开发的厂商一般有自己的引擎,你感觉是窗口,但实际是位图或其他图片格式,只不过是由那个引擎判断你的鼠标是否在位图的rect内,并且处理所有窗口消息,换句话说,所有的消息都是引擎来处理,并没有交给像CWnd::OnMouseMove之类的默认处理,所以并没有创建窗口,你用枚举窗口的方法自然得不到了
思危 2006-09-05
  • 打赏
  • 举报
回复
为了优化速度提供效率,很多游戏里的按钮和子窗口都不是真正windows概念上的窗口,而是一幅图片或是其他什么的。所以你抓不到

15,978

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 界面
社区管理员
  • 界面
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧