找回密码
 立即注册

QQ登录

只需一步,快速开始

查看: 4502|回复: 1

[教程源码] [转载][361度]通过子窗口坐标查找子窗口

[复制链接]
  • 打卡等级:武林至尊

1087

主题

2143

回帖

4337

积分

院长

鲜花
9
猫粮
7540
QQ
发表于 2018-10-11 20:07:44 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?立即注册

×

查找子窗口的时候有时会遇到多个子窗口的类名和标题相同的情况,这个时候如何查找准确查找子窗口呢?这里演示一种子窗口相对父窗口的位置不变的情况下查找子窗口的方法。


361度窗口插件7.30版开始增加了根据窗口位置筛选窗口句柄的函数FilterWindowPos,FilterWindowPos并不能直接查找窗口,而是对EnumWindowA和EnumWindowT返回的窗口句柄数组进行进一步的筛选。FilterWindowPos有两种筛选模式,第一种是用指定坐标是否在窗口区域内来筛选,第二种是用窗口左上角坐标来筛选。第一种模式易用,第二种模式精确(可以防止窗口重叠导致筛选的结果有多个)。



FilterWindowPos的参数及返回值说明如下:
参数:
参数1 窗口句柄数组:长整型数数组。窗口句柄的数组,可以通过本插件中的EnumWindowA函数或EnumWindowT函数获得。
参数2 窗口句柄:长整型数。要筛选的所有窗口的父窗口或者祖先窗口的窗口句柄,取0时用屏幕坐标筛选窗口句柄。
参数3 横坐标:长整型数。参数2的窗口客户区横坐标,参数2取0时为屏幕横坐标。
参数4 纵坐标:长整型数。参数2的窗口客户区纵坐标,参数2取0时为屏幕纵坐标。
参数5 模式:长整型数。取0时,筛选的是参数3和参数4的坐标在窗口区域内的窗口句柄;取1时,筛选的是参数3和参数4的坐标是窗口左上角的窗口句柄。
返回值:
长整型数数组。返回符合条件的窗口句柄数组,无符合条件的窗口句柄和失败时返回的是大小为0的一维数组。

使用FilterWindowPos要先确定参数2的窗口,参数2的窗口句柄建议和获得参数1的窗口句柄数组使用的EnumWindowA的参数1相同。参数2确定后就要获得参数3和参数4的坐标,这个根据参数5的模式不同,获取方法也不同。这里用361度窗口插件配套的窗口查看器,获取它们。


用指定坐标是否在窗口区域内来筛选的模式下,获取参数3和参数4的坐标方法如下(以系统自带计算器为例):


1.用窗口查看器选中参数2的窗口,这里选中计算器的顶层窗口。

                               
登录/注册后可看大图

2.将鼠标移到要查找的子窗口上,捕获鼠标的窗口客户区坐标。这里获取“1”按钮,所以将鼠标移到“1”按钮上。

                               
登录/注册后可看大图

从窗口查看器的下面可以看到客户区坐标为“31, 206”,这就是我们要获取的参数3和参数4的坐标。

脚本例子如下:
[按键精灵] 纯文本查看 复制代码
//获得计算器的顶层窗口句柄
Hwnd = Plugin.WndEx7_31.FindWindow("CalcFrame", 0)
If Hwnd = 0 Then 
    MsgBox "未找到计算器窗口", 4096
    EndScript
End If
//获得窗口类名为“Button”的后代窗口的窗口句柄
HwndArray = Plugin.WndEx7_31.EnumWindowA(Hwnd, 0, "Button", 0)
//筛选窗口区域包含窗口客户区坐标(31,206)的窗口句柄
HwndArray = Plugin.WndEx7_31.FilterWindowPos(HwndArray, Hwnd, 31, 206, 0)
n = UBound(HwndArray)
If n=-1 Then
    MsgBox "窗口未找到", 4096
Else
    MsgBox "找到窗口" & CStr(n+1) & "个,窗口句柄如下:" & vbCrLf & Join(HwndArray, ","), 4096
End If

用窗口左上角坐标来筛选的模式下,获取参数3和参数4的坐标方法如下(以系统自带计算器为例):


1.用窗口查看器选中参数2的窗口,这里选中计算器的顶层窗口。注意:完成第2步前,计算器窗口不要移动。

                               
登录/注册后可看大图

记下窗口查看器的客户区范围的左上角坐标“314, 232”。
2.用窗口查看器选中要查找的子窗口,这里选中的是按钮“1”。

                               
登录/注册后可看大图

记下窗口范围(不是客户区范围)的左上角坐标“325, 425”。收集数据到这里已经完成了,下面是计算。

参数3=步骤2记录的横坐标-步骤1记录的横坐标
参数4=步骤2记录的纵坐标-步骤1记录的纵坐标

所以
参数3=325-314=11
参数4=425-232=193

脚本例子如下:
[按键精灵] 纯文本查看 复制代码
//获得计算器的顶层窗口句柄
Hwnd = Plugin.WndEx7_31.FindWindow("CalcFrame", 0)
If Hwnd = 0 Then 
    MsgBox "未找到计算器窗口", 4096
    EndScript
End If
//获得窗口类名为“Button”的后代窗口的窗口句柄
HwndArray = Plugin.WndEx7_31.EnumWindowA(Hwnd, 0, "Button", 0)
//筛选窗口坐标为(11,193)的窗口句柄
HwndArray = Plugin.WndEx7_31.FilterWindowPos(HwndArray, Hwnd, 11, 193, 1)
n = UBound(HwndArray)
If n=-1 Then
    MsgBox "窗口未找到", 4096
Else
    MsgBox "找到窗口" & CStr(n+1) & "个,窗口句柄如下:" & vbCrLf & Join(HwndArray, ","), 4096
End If

脚本中使用的361度窗口插件下载:
https://pan.baidu.com/s/1pLIS7Gn

窗口查看器下载:
https://pan.baidu.com/s/1gdKVSe3

本文转载于361度插件作者博客
http://bg361.blog.163.com/
楼主热帖

1

主题

7

回帖

8

积分

学前班

鲜花
0
猫粮
22
发表于 2021-12-28 08:38:03 | 显示全部楼层
o(∩_∩)oo(∩_∩)oo(∩_∩)oo(∩_∩)o
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|Archiver|手机版|小黑屋|紫猫编程学园

GMT+8, 2024-12-27 12:52

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表