C#FindWindowEx参数详解「建议收藏」

C#FindWindowEx参数详解「建议收藏」FindWindowEx参数详解本函数的其他内容在网络上都比较多,这里主要说一下它的参数设置和搜索结果的区别。函数功能:在窗口列表中寻找与指定条件相符的第一个子窗口。该函数获得一个窗口的句柄,该窗口的类名和窗口名与给定的字符串相匹配。这个函数查找子窗口,从排在给定的子窗口后面的下一个子窗口开始。在查找时不区分大小写。函数原型:HWNDFindWindowEx(HWNDh

大家好,又见面了,我是你们的朋友全栈君。

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#中为newIntPtr(0)),查找从hwndParent的第一个子窗口开始。如果hwndParent 和 hwndChildAfter同时为NULL,则函数查找所有的顶层窗口及消息窗口。

lpszClass:指向一个指定了类名的空结束字符串,或一个标识类名字符串的成员的指针。如果该参数为一个成员,则它必须为前次调用theGlobaIAddAtom函数产生的全局成员。该成员为16位,必须位于lpClassName的低16位,高位必须为0。

lpszWindow:指向一个指定了窗口名(窗口标题)的空结束字符串。如果该参数为 NULL(注意:””和null是有区别的),则为所有窗口全匹配。

返回值:如果函数成功,返回值为具有指定类名和窗口名的窗口句柄。如果函数失败,返回值为NULL。

    [DllImport(“User32.dll”, EntryPoint = “FindWindowEx”)]
        public static extern IntPtr FindWindowEx(IntPtr hwndParent, IntPtr hwndChildAfter, string lpClassName, string lpWindowName);

例子:

//******************这部分内容是为了说明函数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,newIntPtr(0), lpszClass_Submit,“”);

                if (!ExitWnd.Equals(IntPtr.Zero))

                {

                    GetWindowText(ExitWnd, stbf_WndStr, stbf_WndStr.Capacity – 1);

                    tbDisplay.Text = tbDisplay.Text +“\r\n实验内容: ExitWnd.text = “ + 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,newIntPtr(0), lpszClass_Submit,“Exit”);

                if (!ExitWnd.Equals(IntPtr.Zero))

                {

                    GetWindowText(ExitWnd, stbf_WndStr, stbf_WndStr.Capacity – 1);

                    tbDisplay.Text = tbDisplay.Text +“\r\n实验内容: ExitWnd.text = “ + 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,newIntPtr(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();

                }

                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”

实验内容: ExitWnd.text = Exit

 

3) 此处寻找不到Login的按键,因为Name不为null,而是等于””

无法找到登录按键的子窗口!!!

 

4) 此处寻找不到Login的按键,因为FindWindowEx第二个参数为空,且Name = null,从第一个子窗口开始查找,根据Tab Index的顺序找到的第一个属于按键类的该是Reset按键.

已搜索到登录按键: Reset

 

5) 成功寻找到Login的按键,此处第2个参数放置ExitWnd或者new IntPtr(0)都可以,因为Exit和Login都属于相同的类,而且具有不同的Name.

已搜索到登录按键: LogIn

 

6) 成功寻找到Login的按键,此处第2个参数放置ExitWnd,即使Name=null也可以找到,因为ExitWnd的下一个就是Login按键.

已搜索到登录按键: LogIn

 

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/138013.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • 计算机win7卡顿如何解决方法,win7卡顿严重解决方法_win7运行卡顿严重最流畅设置方法-win7之家…[通俗易懂]

    计算机win7卡顿如何解决方法,win7卡顿严重解决方法_win7运行卡顿严重最流畅设置方法-win7之家…[通俗易懂]在使用win7系统电脑的时间一长,出现的电脑故障也就会越多,这大多数都是用户自己所造成的,例如有用户的win7系统在运行过程中总是会出现严重卡顿的情况,这让许多用户都感到很难受,那么win7卡顿严重怎么解决呢?下面小编就来告诉大家win7运行卡顿严重最流畅设置方法。具体方法:1、右击【计算机】选择属性;2、在出现的面板的左侧栏选择【高级系统设置】;3、依次点击【高级】【设置】;4、默认是【让系统选…

    2022年9月12日
    0
  • 30岁之后,人的命运就藏在《周易》中,看懂受益一生!

    30岁之后,人的命运就藏在《周易》中,看懂受益一生!

    2022年2月20日
    46
  • android之layout_weight体验(实现按比例显示)

    在android开发中LinearLayout很常用,LinearLayout的内控件的android:layout_weight在某些场景显得非常重要,比如我们需要按比例显示。android并没用提供table这样的控件,虽然有TableLayout,但是它并非是我们想象中的像html里面的table那么好用,我们常用ListView实现table的效果,但是列对齐确比较麻烦,现在用Linear

    2022年3月9日
    56
  • BP神经网络原理及实现

    BP神经网络原理及实现BP神经网络原理经典的BP神经网络通常由三层组成:输入层,隐含层与输出层.通常输入层神经元的个数与特征数相关,输出层的个数与类别数相同,隐含层的层数与神经元数均可以自定义.每个神经元代表对数据的一次处理:每个隐含层和输出层神经元输出与输入的函数关系为:其中Wij表示神经元i与神经元j之间连接的权重,Oj代表神经元j的输出,sigmod是一个特殊的函数用于将任意实数映射到(0,1)区间.上文中的sigmod函数称为神经元的激励函数(activationfunction),除了sig

    2022年7月20日
    12
  • sql server下载安装步骤(sql2005安装教程图解)

    sql server下载安装步骤(sql2005安装教程图解)SQLServer2017下载安装教程第一步:打开浏览器,在浏览的搜索框中我们输入“SQLServer”。如图,会匹配出中文两条微软官方下载页面(一个页面内容是英文、一个页面内容是中文)。这里我们以中文的为例。第二步:点击进入下载页面后,可以看到如图所示页面,我们不要着急点击下载,因为这些SQLServer只能试用180天(大家从介绍中可以看到)。第三步:我们将网页下滑,可以看到…

    2022年4月18日
    416
  • Flyway入门_flyrouter

    Flyway入门_flyrouter1.为什么要用flyway?在真实的项目开发中,我们每个人都会有一个应用软件和与其相联系的数据库。对于个人开发来说,这样就够了。但是,项目开发一般都不止一个人,因此一定会出现我在我的本地有一套软件和相应的数据库系统,我的另一个同事会在他的本地有一套他自己的软件和相应的数据库系统。我们需要面临的第一个问题就是我们两个人如何集成我们的数据库系统,之后还要处理如何将数据库系统迁移到测试环境和生产环境当…

    2025年7月26日
    0

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号