FindWindow、FindWindowEx、EnumWindows、EnumChildWindows使用详解

  • 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搜索子控件。另外,出于安全考虑或其它因素部分控件只可针对类名进行查询处理,无法查询标题内容,如:自绘控件的标题、外部程序的普通编辑框(标题即为编辑框内容)、密码编辑框等等。

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

lzl_li

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值