VC++/MFC 查找多个同类无标题子窗口
假设用Spy++查到一个程序标题为"XXX",下面有3个同类名的子窗口(类名假设都为"AAA"),并且都没有标题名称。如何获得第2个子窗口的句柄? hwnd=:...
假设 用Spy++查到一个程序标题为"XXX",下面有3个同类名的子窗口(类名假设都为"AAA"),并且都没有标题名称。 如何获得第2个子窗口的句柄? hwnd = ::FindWindow(NULL,"XXX");hwnd2=::FindWindowEx(hwnd,NULL,"AAA",NULL);自己试了下,连第1个子窗口都没找到,别说第2个子窗口了。。。
展开
3个回答
展开全部
参考以下:用HWND hChild = ::GetWindow(ParentWnd, GW_CHILD);
/****************************************************************************
寻找指定类名的子窗口句柄 方法一
****************************************************************************/
static
HWND FindWithClassName(HWND ParentWnd,const TCHAR* FindClassName)
{
HWND hChild = ::GetWindow(ParentWnd, GW_CHILD);
TCHAR ClassName[100];
for(; hChild!=NULL ; hChild=::GetWindow(hChild,GW_HWNDNEXT))
{
::GetClassName(hChild,ClassName,sizeof(ClassName)/sizeof(TCHAR));
if (_tcscmp(ClassName,FindClassName)==0)
return hChild;
HWND FindWnd=FindWithClassName(hChild,FindClassName);
if (FindWnd)
return FindWnd;
}
return NULL;
}
/****************************************************************************
获取主窗口下某个子窗口的窗口句柄
参数1:最顶层父窗口
参数2:控件ID,可使用spy++(VS2008版本) 查看
****************************************************************************/
static
HWND FindControlWnd(HWND ParentWnd,DWORD ControlID)
{
HWND hChild = ::GetWindow(ParentWnd, GW_CHILD);
for(; hChild!=NULL ; hChild=::GetWindow(hChild,GW_HWNDNEXT))
{
//判断是否为需要的控件
if ( GetDlgCtrlID(hChild) == ControlID )
return hChild;
HWND FindWnd=FindControlWnd(hChild,ControlID);
if (FindWnd)
return FindWnd;
}
return NULL;
}
/****************************************************************************
寻找指定类名的子窗口句柄 方法一
****************************************************************************/
static
HWND FindWithClassName(HWND ParentWnd,const TCHAR* FindClassName)
{
HWND hChild = ::GetWindow(ParentWnd, GW_CHILD);
TCHAR ClassName[100];
for(; hChild!=NULL ; hChild=::GetWindow(hChild,GW_HWNDNEXT))
{
::GetClassName(hChild,ClassName,sizeof(ClassName)/sizeof(TCHAR));
if (_tcscmp(ClassName,FindClassName)==0)
return hChild;
HWND FindWnd=FindWithClassName(hChild,FindClassName);
if (FindWnd)
return FindWnd;
}
return NULL;
}
/****************************************************************************
获取主窗口下某个子窗口的窗口句柄
参数1:最顶层父窗口
参数2:控件ID,可使用spy++(VS2008版本) 查看
****************************************************************************/
static
HWND FindControlWnd(HWND ParentWnd,DWORD ControlID)
{
HWND hChild = ::GetWindow(ParentWnd, GW_CHILD);
for(; hChild!=NULL ; hChild=::GetWindow(hChild,GW_HWNDNEXT))
{
//判断是否为需要的控件
if ( GetDlgCtrlID(hChild) == ControlID )
return hChild;
HWND FindWnd=FindControlWnd(hChild,ControlID);
if (FindWnd)
return FindWnd;
}
return NULL;
}
展开全部
EnumChildWindows(HWND hWndParent, WNDENUMPROC lpEnumFunc, LPARAMlParam );
//用这个可以枚举所有子窗体。下面这个是回调函数。
BOOL CALLBACK EnumFunc( HWND hwnd, LPARAM lParam )//参数hwnd就是枚举进来的子窗口句柄
{
char str[100];
GetWindowText(hwnd, str, 100);
AfxMessageBox(str);
return TRUE;
}
//用这个可以枚举所有子窗体。下面这个是回调函数。
BOOL CALLBACK EnumFunc( HWND hwnd, LPARAM lParam )//参数hwnd就是枚举进来的子窗口句柄
{
char str[100];
GetWindowText(hwnd, str, 100);
AfxMessageBox(str);
return TRUE;
}
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
EnumChildWindows(HWND hWndParent, WNDENUMPROC lpEnumFunc, LPARAMlParam );
BOOL CALLBACK EnumFunc( HWND hwnd, LPARAM lParam )//参数hwnd就是枚举进来的子窗口句柄
{
char str[100];
GetWindowText(hwnd, str, 100);
AfxMessageBox(str);
return TRUE;
}
BOOL CALLBACK EnumFunc( HWND hwnd, LPARAM lParam )//参数hwnd就是枚举进来的子窗口句柄
{
char str[100];
GetWindowText(hwnd, str, 100);
AfxMessageBox(str);
return TRUE;
}
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询