c#如何跳出一个函数_C# 句柄获取模块

d8fb32ae0a4b5ca3b2641cdeef61ece0.png

前言

最近整一个项目,它需要能自动操纵设备软件上的某些按钮,来得到我们所期待的设备控制要求。

这样类似的功能,通常都是需要通过获取句柄的方式,然后发送Message来实现。以前我都是用VB6.0来实现,那是一个很老的编程环境,微软也不维护它了。还好,现在有了更为强大和满是甜糖的C#,于是怎样用C#来实现句柄的获取,成了很有趣的探讨内容。

句柄获取的方法,在网络上能搜到很多很多介绍,这里我介绍下我整合的一个句柄获取函数,它通过提供三个参数(Name,Class,Deep)来找到我们所关心的那个控件的句柄。

该函数将句柄的获取过程公式化了,为以后的开发利用提供了很好的通用模块。

先抛出全部代码

using 

使用方法

获取句柄,不得不提强大的spy++,我的这个模块的使用,得首先用spy++获取如下基本信息

  1. 程序主窗口的“标题”
  2. 程序主窗口的的“类”
  3. 控件句柄在主窗口的“深度”(这是我这个函数最突出的地方)

一:什么是程序主窗口

c883a5d1e4dd34618e6869159961ca55.png
所谓程序主窗口指,直属#32769(桌面)下的窗口

二:“标题”和“类”怎样找

d916763ea5d5f5132619dfb84842979b.png
用句柄查找工具获得的信息“标题”“类”

三:Deep怎样确认

4ea8bede9f65aba10786e461e79e1805.png
Deep的确认方法

从图中我们可以看到,我要找到“有道词典”(A)处的句柄,只要用数数的方法一层层地确认到(A)处,然后确定它的层级表示字符串“3-1-1”即可。

类似的(B)处,它的Deep参数为“3-3”,(C)处的Deep为“5"

因为我在解算Deep字符串时用的是正则表达式,所以Deep参数对数值的隔离符号并没有很多要求"3-1-1";"3/1/1";"3;1;1";"3 1 1"等等均可,只要能区分处数值就行。

运行验证

3c9ede360c7c4dcc8b8dc73330ca7bc1.png
有道词典下 3-1-1处句柄值与spy++的一致

161a4b661157c7a60526cbc7ec935666.png
有道词典下3-3处的句柄与spy++的一致

f0c99758e48e6cef5d78f4f4014fc50a.png
这是1-1-1-1下的句柄值,也没错哦

问题点求解

1:通过sendmessage发送消息失败的问题

如开始讲的那样,我获取句柄的根本目的是,用来给第三方应用程序的某个按钮发送Click动作的。比如:非故障的警示对话框的消除;设备程序某个查看窗口的跳出与界面切换等。

但实际使用时常常发现,很多时候标准的WM_LBUTTONDOWN WM_LBUTTONUP 消息并不能触发第三方软件的按钮动作(比如:STC单片机的ISP程序上的按钮)。此时可能需要我们找到所能控制它的消息到底是什么。

2:新出的软件找不到按钮的句柄

这是个很头疼的问题,现在时新主流的软件,用spy++扫过去就只能得到主窗口句柄,而且句柄树下同样干净得很,而它那些按钮明明就摆在那里(可能是XAML技术生成的界面吧)。

如此:句柄的功用将被压缩得无所是处!

迫切想知道,类似的软件没有句柄的帮助,该如何去操纵!

请大神指点!

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
函数功能 在窗口列表中寻找与指定条件相符的第一个窗口 。 该函数获得一个窗口句柄,该窗口的类名和窗口名与给定的字符串相匹配。这个函数查找子窗口,从排在给定的子窗口后面的下一个窗口开始。在查找时不区分大小写。 参数; (1)hwndParent:要查找的子窗口所在的父窗口句柄(如果设置了hwndParent,则表示从这个hwndParent指向的父窗口中搜索子窗口)。 如果hwndParent为 0 ,则函数以桌面窗口为父窗口,查找桌面窗口的所有子窗口。 Windows NT5.0 and later:如果hwndParent是HWND_MESSAGE,函数仅查找所有消息窗口。 (2)hwndChildAfter :子窗口句柄。查找从在Z序中的下一个窗口开始。子窗口必须为hwndParent窗口的直接子窗口而非后代窗口。如果HwndChildAfter为NULL,查找从hwndParent的第一个窗口开始。如果hwndParent 和 hwndChildAfter同时为NULL,则函数查找所有的顶层窗口及消息窗口。 (3)lpszClass:指向一个指定了类名的空结束字符串,或一个标识类名字符串的成员的指针。如果该参数为一个成员,则它必须为前次调用theGlobaIAddAtom函数产生的全局成员。该成员为16位,必须位于lpClassName的低16位,高位必须为0。 (4)lpszWindow:指向一个指定了窗口名(窗口标题)的空结束字符串。如果该参数为 NULL,则为所有窗口全匹配。 返回值 Long,找到的窗口句柄。如未找到相符窗口,则返回零。会设置GetLastError 如果函数成功,返回值为具有指定类名和窗口名的窗口句柄。如果函数失败,返回值为NULL。 若想获得更多错误信息,请调用GetLastError函数

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值