FindWindowEx参数详解
FindWindowEx参数详解
本函数的其他内容在网络上都比较多,这里主要说一下它的参数设置和搜索结果的区别。
函数功能:在窗口列表中寻与指定条件相符的第一个子窗口。该函数获得一个窗口的句柄,该窗口的类名和窗口名与给定的字符串相匹配。这个函数查子窗口,从排在给定的子窗口后面的下一个子窗口开始。在查时不区分大小写。
函数原型:
HWND FindWindowEx(HWND hwndParent,HWND hwndChildAfter,LPCTSTR lpszClass,LPCTSTR lpszWindow);参数:
hwndParent:要查子窗口的父窗口句柄。
如果hwndParent为NULL,则函数以桌面窗口为父窗口,查桌面窗口的所有子窗口。
Windows NT5.0 and later:如果hwndParent是HWND_MESSAGE,函数仅查所有消息窗口。
hwndChildAfter :子窗口句柄。查从在Z序中的下一个子窗口开始。子窗口必须为hwndParent窗口的直接子窗口而非后代窗口。如果HwndChildAfter为NULL(C#中为new IntPtr(0)),查从hwndParent的第一个子窗口开始。如果hwndParent 和hwndChildAfter同时为NULL,则函数查所有的顶层窗口及消息窗口。
lpszClass:指向一个指定了类名的空结束字符串,或一个标识类名字符串的成员的指针。如果该参数为一个成员,则它必须为前次调用theGlobaIAddAtom函数产生的全局成员。该成员为16位,必须位于lpClassName的低16位,高位必须为0。
lpszWindow:指向一个指定了窗口名(窗口标题)的空结束字符串。如果该参数为NULL(注意:””和null是有区别的),则为所有窗口全匹配。
返回值:如果函数成功,返回值为具有指定类名和窗口名的窗口句柄。如果函数失败,返回值为NULL。
例子:
//****************** 这部分内容是为了说明函数FindWindowEx的用法的额外的实验部分******************// IntPtr ExitWnd = new IntPtr(0); //临时储存操作窗体的句柄
StringBuilder stbf_WndStr = new StringBuilder();//定义存储String的Butter
stbf_WndStr.Capacity = 60;
//1) 该例子一直无法到Exit按键,因为Name不为null,而是等于"",null和""是有区别的
tbDisplay.Text = tbDisplay.Text + "\r\n\r\n1) 此处寻不到Exit的按键,因为Name不为null,而是等于\"\"";
ExitWnd = FindWindowEx(ParenthWnd, new IntPtr(0), lpszClass_Submit, "");
if (!ExitWnd.Equals(IntPtr.Zero))
{
GetWindowText(ExitWnd, stbf_WndStr, stbf_WndStr.Capacity - 1);
tbDisplay.Text = tbDisplay.Text + "\r\n实验内容: = "+ stbf_WndStr.ToString(); }
else
{
tbDisplay.Text = tbDisplay.Text + "\r\nErr: ExitWnd = null";
}
//2) 寻到Exit的按键,因为Name包含正确的名字"Exit"
tbDisplay.Text = tbDisplay.Text + "\r\n\r\n2) 寻到Exit的按键,因为Name包含正确的名字
\"Exit\"";
ExitWnd = FindWindowEx(ParenthWnd, new IntPtr(0), lpszClass_Submit, "Exit");
if (!ExitWnd.Equals(IntPtr.Zero))
{
GetWindowText(ExitWnd, stbf_WndStr, stbf_WndStr.Capacity - 1);
tbDisplay.Text = tbDisplay.Text + "\r\n实验内容: = "+ stbf_WndStr.ToString(); }
else
{
tbDisplay.Text = tbDisplay.Text + "\r\nErr: ExitWnd = null";
}
//3) 此处寻不到Login的按键,因为Name不为null,而是等于"",null和""是有区别的
tbDisplay.Text = tbDisplay.Text + "\r\n\r\n3) 此处寻不到Login的按键,因为Name不为null,而是等于\"\"";
LogBtWnd = FindWindowEx(ParenthWnd, ExitWnd, lpszClass_Submit, "");
if (!LogBtWnd.Equals(IntPtr.Zero))
{
GetWindowText(LogBtWnd, stbf_WndStr, stbf_WndStr.Capacity - 1);
tbDisplay.Text = tbDisplay.Text + "\r\n已搜索到登录按键: " + stbf_WndStr.ToString();
}
else
{
tbDisplay.Text = tbDisplay.Text + "\r\n无法到登录按键的子窗口";
}
//4) 此处寻不到Login的按键,因为FindWindowEx第二个参数为空,且Name = null,从第一个子窗口开始查,
//根据Tab Index的顺序到的第一个属于按键类的该是Reset按键.
tbDisplay.Text = tbDisplay.Text
+ "\r\n\r\n4) 此处寻不到Login的按键,因为FindWindowEx第二个参数为空,且Name = null,从第一个子窗口开始查,"
+ "根据Tab Index的顺序到的第一个属于按键类的该是Reset按键.";
LogBtWnd = FindWindowEx(ParenthWnd, new IntPtr(0), lpszClass_Submit, null);
if (!LogBtWnd.Equals(IntPtr.Zero))
{
GetWindowText(LogBtWnd, stbf_WndStr, stbf_WndStr.Capacity - 1);
tbDisplay.Text = tbDisplay.Text + "\r\n已搜索到登录按键: " + stbf_WndStr.ToString();
}
else
{
tbDisplay.Text = tbDisplay.Text + "\r\n无法到登录按键的子窗口";
}
//5) 成功寻到Login的按键,此处第个参数放置ExitWnd或者new IntPtr(0)都可以,因为Exit和Login都
属于相同的类,而且具有不同的Name.
tbDisplay.Text = tbDisplay.Text
+ "\r\n\r\n5) 成功寻到Login的按键,此处第个参数放置ExitWnd或者new IntPtr(0)都可以,"
+ "因为Exit和Login都属于相同的类,而且具有不同的Name.";
LogBtWnd = FindWindowEx(ParenthWnd, ExitWnd, lpszClass_Submit, lpszName_Submit);
if (!LogBtWnd.Equals(IntPtr.Zero))
{
GetWindowText(LogBtWnd, stbf_WndStr, stbf_WndStr.Capacity - 1);
tbDisplay.Text = tbDisplay.Text + "\r\n已搜索到登录按键: " + stbf_WndStr.ToString();
equals不等于}
else
{
tbDisplay.Text = tbDisplay.Text + "\r\n无法到登录按键的子窗口"; }
//6) 成功寻到Login的按键,此处第个参数放置ExitWnd,即使Name=null也可以到,因为ExitWnd的下一
个就是Login按键.
tbDisplay.Text = tbDisplay.Text
+ "\r\n\r\n6) 成功寻到Login的按键,此处第个参数放置ExitWnd,即使Name=null也可以到,因为ExitWnd的下一个就是Login按键.";
LogBtWnd = FindWindowEx(ParenthWnd, ExitWnd, lpszClass_Submit, null);
if (!LogBtWnd.Equals(IntPtr.Zero))
{
GetWindowText(LogBtWnd, stbf_WndStr, stbf_WndStr.Capacity - 1);
tbDisplay.Text = tbDisplay.Text + "\r\n已搜索到登录按键: " + stbf_WndStr.ToString();
}
else
{
tbDisplay.Text = tbDisplay.Text + "\r\n无法到登录按键的子窗口";
}
return;
完整的源代码请参考RemoteLogin的例子。
本段代码输出:
1) 此处寻不到Exit的按键,因为Name不为null,而是等于""
Err: ExitWnd = null
2) 寻到Exit的按键,因为Name包含正确的名字"Exit"
实验内容: = Exit
3) 此处寻不到Login的按键,因为Name不为null,而是等于""
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论