-
FindWindow
函数原型:HWND FindWindow(LPCSTR lpClassName,LPCSTR lpWindowName);
C#.NET声明如下:
[DllImport("user32.dll")]
public static extern IntPtr FindWindow(string lpClassName, string lpWindowName);
功能:用于查找顶层窗口句柄,不搜索子窗口。
第一个参数lpClassName是要查找的窗口类名(不区分大小写);第二个参数lpWindowName是要查找窗口的名称/标题(不区分大小写);返回找到的窗口句柄(没找到返回0)。
如果存在多个匹配项,只返回第一个找到的项,lpClassName可设为NULL代表不指定类名,同样lpWindowName也可设为NULL不指定标题名称,两个都为NULL代表匹配所有将返回第一个窗口(切记,NULL并不是""空字符串,是有区别的)。
-
FindWindowEx
函数原型:HWND FindWindowEx(HWND hWndParent,HWND hWndChildAfter,LPCSTR lpszClass,LPCSTR lpszWindow);
C#.NET声明如下:
[DllImport("user32.dll")]
public static extern IntPtr FindWindowEx(IntPtr hWndParent,IntPtr hWndChildAfter,string lpszClass, string lpszWindow);
功能:在控件列表中寻找与指定条件相符的第一个子控件 。
hWndParent要查找的父控件句柄;hWndChildAfter父控件的子控件句柄,将从此子控件之后开始查找;lpszClass目标子控件类名(不区分大小写);lpszWindow目标子窗口的名称/标题(不区分大小写);返回找到的窗口句柄(没找到返回0)。
如果存在多个匹配项,只返回第一个找到的项,hWndParent可设为IntPtr.Zero表示从桌面中查找顶层窗口不搜索子窗口,类似FindWindow(如果hwndParent是HWND_MESSAGE,函数仅查找所有消息窗口);hWndChildAfter可设为IntPtr.Zero表示从第1个子控件开始搜索;lpszClass可设为NULL代表不指定类名,同样lpszWindow也可设为NULL不指定标题名称(切记,NULL并不是""空字符串,是有区别的)。
-
EnumWindows
函数原型:BOOL EnumWindows(WNDENUMPROC lpEnumFunc, LPARAM lParam);
回调函数原型:BOOL CALLBACK EnumWindowsProc(HWND hwnd, LPARAM lParam);
C#.NET声明如下:
[DllImport("user32.dll")]
public static extern bool EnumWindows(CallBack lpEnumFunc, int lParam);public delegate bool CallBack(IntPtr hwnd, int lParam);//回调函数声明,后续还要实现回调函数实体。
功能:枚举所有屏幕上的顶层窗口,并将窗口句柄传送给应用程序定义的回调函数,回调函数返回FALSE将停止枚举,否则继续到所有顶层窗口枚举完为止。
EnumWindows中的参数:lpEnumFunc回调函数,lParam参数传递给回调函数的lParam。回调函数中的参数:hwnd枚举到的窗口句柄,lParam为EnumWindows传递过来的参数。
C#.NET调用示例:
IntPtr theHandle;
public bool EnumWindowsProc(IntPtr hwnd,int lParam)
{
int len=GetWindowTextLength(hwnd);
if (len > 10)
{
theHandle = hwnd;
return false;//返回FALSE停止枚举
}
return true;
}
public void test()
{
CallBack cbEnumWindows = new CallBack(EnumWindowsProc);
EnumWindows(cbEnumWindows, 0);
}
-
EnumChildWindows
函数原型:
BOOL
EnumChildWindows(
HWND
hWndParent, WNDENUMPROC lpEnumFunc,
LPARAM
lParam);
回调函数原型:
BOOL CALLBACK EnumChildProc(HWND hwnd, LPARAM lParam);
C#.NET声明如下:
[DllImport("user32.dll")]
//回调函数声明,后续还要实现回调函数实体。
public static extern bool EnumChildWindows(IntPtr hWndParent, CallBack lpEnumFunc, int lParam);
public delegate bool CallBack(IntPtr hwnd, int lParam);
功能:枚举指定控件下的所有子控件,并将子控件句柄传送给应用程序定义的回调函数,回调函数返回FALSE将停止枚举,否则一直到所有子控件枚举完为止。
EnumChildWindows
中的参数:hWndParent为目标控件所在的父控件句柄;lpEnumFunc为回调函数;lParam传递给回调函数。回调函数中的参数:hwnd
枚举到的子控件句柄,lParam为EnumChildWindows
传递过来的参数。
如果hWndParent
参数为NULL,则此函数等效于EnumWindows。(调用示例参考上面EnumWindows中的示例)
写在最后,EnumWindows/EnumChildWindows配合API函数GetWindowText与GetClassName可实现FindWindow/FindWindowEx的相同功能,EnumWindows对应FindWindow查询顶层窗口,EnumChildWindows对应FindWindowEx搜索子控件。另外,出于安全考虑或其它因素部分控件只可针对类名进行查询处理,无法查询标题内容,如:自绘控件的标题、外部程序的普通编辑框(标题即为编辑框内容)、密码编辑框等等。