参数:
(1)hwndParent:要查找的子窗口所在的父窗口的句柄
如果设置了hwndParent,则表示从这个hwndParent指向的父窗口中搜索子窗口。
如果hwndParent为 0 ,则函数以桌面窗口为父窗口,查找桌面窗口的所有子窗口。
如果hwndParent是HWND_MESSAGE,函数仅查找所有消息窗口。
(2)hwndChildAfter :子窗口句柄。查找从在Z序中的下一个子窗口开始。子窗口必须为hwndParent窗口的直接子窗口而非后代窗口。
如果HwndChildAfter为NULL,查找从hwndParent的第一个子窗口开始。
如果hwndParent 和 hwndChildAfter同时为NULL,则函数查找所有的顶层窗口及消息窗口。
(3)lpszClass:指向一个指定了类名的空结束字符串,或一个标识类名字符串的成员的指针。
(4)lpszWindow:指向一个指定了窗口名(窗口标题)的空结束字符串。如果该参数为 NULL,则为所有窗口全匹配。
返回值:
如果函数成功,返回值为具有指定类名和窗口名的窗口句柄。如果函数失败,返回值为NULL。
3. EnumWindows()
BOOL EnumWindows(WNDENUMPROC lpEnumFunc,LPARAM lParam)
功能:
该函数枚举所有屏幕上的顶层窗口,并将窗口句柄传送给应用程序定义的回调函数。
回调函数返回FALSE将停止枚举,否则EnumWindows函数继续到所有顶层窗口枚举完为止。
参数:
lpEnumFunc:指向一个应用程序定义的回调函数指针
lPararm:指定一个传递给回调函数的应用程序定义值
返回值:
如果函数成功,返回值为非零;如果函数失败,返回值为零。
回调函数原型:
BOOL CALLBACK EnumWindowsProc(HWND hwnd,LPARAM lParam);
hwnd:顶层窗口的句柄
lparam:应用程序定义的一个值(即EnumWindows中lParam)
4 EnumChildindows()
BOOL EnumChildWindows(HWND hWndParent,WNDENUMPROC lpEnumFunc, LPARAM lParam);
功能:
枚举一个父窗口的所有子窗口。
如果回调函数返回true,则枚举继续直到枚举完成;如果返回false,则将会中止枚举。
参数:
hWndParent: 父窗口句柄
lpEnumFunc: 回调函数的地址
lParam: 自定义的参数
返回值:
如果函数成功,返回值为非零;如果函数失败,返回值为零。
回调函数原型:
BOOL CALLBACK EnumWindowsProc(HWND hwnd,LPARAM lParam);
hwnd:顶层窗口的句柄
lparam:应用程序定义的一个值(即EnumWindows中lParam)
异同点:
1. FindWindow 查找顶级窗口,不搜索子窗口。而FindWindowEx则是查找一个窗口的子窗口。
相同点:都是只查找一次,找到返回窗口句柄,找不到返回NULL。 都可与while构成循环。
2. EnumWindows 枚举屏幕上的所有顶层窗口; 而EnumChildWindows 则枚举一个父窗口的所有子窗口。
相同点,都是通过回调函数实现,回调函数会阻塞直到枚举完成,或者枚举中止。
3. FindWindow(NULL, NULL) 的While循环 与 EnumWindows() 相同;
4. FindWindowEx(.., NULL, .., ..) 的While循环 与 EnumChildWindows() 相同;
例如:
void Find()
{
HWND hwnd = NULL;
HWND AfterHwnd = NULL;
while(true)
{
hwnd = ::FindWindowEx(NULL, AfterHwnd, _T("#32770"), NULL);
if(!hwnd)
{
break;
}
else
{
TCHAR szTitle[MAX_PATH] = {0};
::GetWindowText(hwnd, szTitle, MAX_PATH))
if(wcsstr(strTitle, _T("Test")) != 0)
{
//...相关代码
}
}
AfterHwnd = hwnd;
}
}