帖子说明:今天有人问了如何按下面图片示意1-9顺序获取句柄,然后我进入了深思
- 自带Window插件中Search、SearchEx;大漠EnumWindow命令获取的句柄均为乱序
- 1-9窗口是提问人随意摆的,并程序非打开的对应顺序,也无法通过程序打开的次序及对应PID获取句柄
思路1:
- 获取窗口左上角图标的所有坐标,这样会返回9个坐标,在通过361窗口插件或大漠插件获取指定坐标的句柄
- 结论:可这样一个问题,图片被挡住了怎么办,我进入了牛角尖,然后我想了思路2
思路2:获取所有句柄,然后得到窗口左上角坐标,然后双for进行排序
- HwndEx = Plugin.Window.SearchEx(0,"记事本",0)
- MyArray = Split(HwndEx, "|")
- For i=0 to UBound(MyArray)-1
- sRect = Plugin.Window.GetClientRect(MyArray(i))
- 左上 = Split(sRect, "|")
- 左= Clng(左上(0)): 上 = Clng(左上(1))
- TracePrint "第 " & i + 1 & " 个窗口句柄为:" & MyArray(i) & "x坐标" & 左 & ",y坐标" & 上
- 重组信息=重组信息& MyArray(i)&"-"&左&","&上&"|"
- Next
- 重组信息= "|"&重组信息
- TracePrint 重组信息
- Sub tx()
- TracePrint now()
- TracePrint "1"
- For x = 1 To 1920
- For y = 1 To 1080
- If instr(重组信息,"-"& x & "," & y) > 0 Then
- TracePrint x&","&y
- TracePrint Split(split(重组信息,"-"&x&","&y)(0),"|")(1)
- End If
- Next
- Next
- TracePrint now()
- End Sub
- Call tx()
复制代码 思路3:通过计算谁离左上、中上、右上最近得出1-3,通过计算谁离左中,中中,右中得出4-6. ...调试结果:源码一览:HwndEx = Plugin.Window.SearchEx(0,"记事本",0)
MyArray = Split(HwndEx, "|")
For i=0 to UBound(MyArray)-1
sRect = Plugin.Window.GetClientRect(MyArray(i))
左上 = Split(sRect, "|")
左= Clng(左上(0)): 上 = Clng(左上(1))
TracePrint "第 " & i + 1 & " 个窗口句柄为:" & MyArray(i) & "x坐标" & 左 & ",y坐标" & 上
重组信息 = 重组信息 & MyArray(i) & "-" & 左 & "," & 上 & "|"
总坐标=总坐标 &左 & "," & 上 & "|"
Next
重组信息 = "|" & 重组信息
总坐标=mid(总坐标,1,len(总坐标)-1)
TracePrint 重组信息
TracePrint 总坐标
左上="1,1"‘可改为获取分辨率 公式计算
中上="960,1"
右上 ="1920,1"
//
左中 ="1,540"
中中 ="960,540"
右中 ="1920,540"
//
左下 ="1,1080"
中下 ="960,1080"
右下 = "1920,1080"
窗口坐标=array(左上,中上,右上,左中,中中,右中,左下,中下,右下)
For ii = 0 To 8
句柄 = 点到点坐标组最近的一个(窗口坐标(ii), 总坐标)
TracePrint 句柄
重新排序句柄=重新排序句柄&句柄&"|"
Next
TracePrint 重新排序句柄
Function 点到点坐标组最近的一个(坐标, 坐标组字符串)'收录函数
TracePrint "=========================="
TracePrint 坐标
Dim i, 坐标数组, min, 返回坐标值
x = split(坐标, ",")(0)
y=split(坐标,",")(1)
坐标数组 = split(坐标组字符串, "|")
For i = 0 To UBound(坐标数组)
距离=(split(坐标数组(i),",")(0)-x)^2+(split(坐标数组(i),",")(1)-y)^2
If i = 0 Then
min = 距离
Else
If 距离 < min Then
min = 距离
返回坐标值=坐标数组(i)
End If
End If
Next
min = Sqr(min)
TracePrint "最近点的坐标是:" & 返回坐标值 & "距离是:" & min
分割1 = split(重组信息, "-" & 返回坐标值)(0)
分割2=split(分割1,"|")(UBound( split( 分割1,"|")))
点到点坐标组最近的一个=分割2
End Function
若有新思路 请跟帖 一起交流
作者QQ:414098315- t1 = Plugin.Sys.GetTime()
- HwndEx = Plugin.Window.SearchEx(0,"记事本",0)
- MyArray = Split(HwndEx, "|")
- For i=0 to UBound(MyArray)-1
- sRect = Plugin.Window.GetClientRect(MyArray(i))
- 左上 = Split(sRect, "|")
- 左 = Clng(左上(0)) : 上 = Clng(左上(1)) :下 = Clng(左上(3))
- 斜边 = (左 ^ 2 + 上 ^ 2) ^ 0.5
- 高度 = 下 - 上
- // TracePrint "第 " & i + 1 & " 个窗口句柄为:" & MyArray(i) & "x坐标" & 左 & ",y坐标" & 上
- If i = UBound(MyArray) - 1 Then
- 句柄信息 = 句柄信息 & MyArray(i)
- 斜边信息 = 斜边信息 & 斜边
- Y信息 = Y信息 & 上
- 窗口高度 = 窗口高度 & 高度
- Else
- 句柄信息 = 句柄信息 & MyArray(i) & "|"
- 斜边信息 = 斜边信息 & 斜边 & "|"
- Y信息 = Y信息 & 上 & "|"
- 窗口高度 = 窗口高度 & 高度 & "|"
- End If
- Next
- TracePrint 句柄排序(斜边信息, Y信息, 句柄信息,窗口高度)
- TracePrint CStr(Plugin.Sys.GetTime() - t1) +"毫秒"
- Function 句柄排序(data, str, hwnd,height)
- Dim 句柄重组
- data = Split(data, "|")
- yData = Split(str, "|")
- hwndData = Split(hwnd, "|")
- heightData = Split(height, "|")
- For i = 0 To UBound(data)-1
- For j = i + 1 To UBound(data)
- If CInt(data(i)) > CInt(data(j)) Then
- temp = data(j)
- data(j) = data(i)
- data(i) = temp
-
- temphwnd = hwndData(j)
- hwndData(j) = hwndData(i)
- hwndData(i) = temphwnd
-
- tempy = yData(j)
- yData(j) = yData(i)
- yData(i) = tempy
- End If
- Next
- Next
-
- For i = 0 To UBound(yData)-1
- For j = i + 1 To UBound(yData)
- If CInt(yData(i)) > CInt(yData(j)) and abs(CInt(yData(i)) - CInt(yData(j))) > CInt(heightData(i)) / 2 Then
- temphwnd = hwndData(j)
- hwndData(j) = hwndData(i)
- hwndData(i) = temphwnd
- End If
- Next
- Next
-
- For i = 0 To UBound(hwndData)
- If i = UBound(hwndData) Then
- 句柄重组 = 句柄重组 & hwndData(i)
- Else
- 句柄重组 = 句柄重组 & hwndData(i) & "|"
- End If
- Next
- 句柄排序 = 句柄重组
- End Function
复制代码