• 按键公众号 :
按键精灵电脑版
立即下载

软件版本:2014.06
软件大小:22.9M
更新时间:2021-12-03

按键精灵安卓版
立即下载

软件版本:3.7.2
软件大小:46.2M
更新时间:2023-05-10

按键精灵iOS版
立即下载

软件版本:1.8.0
软件大小:29.2M
更新时间:2023-03-21

按键手机助手
立即下载

软件版本:3.8.0
软件大小:262M
更新时间:2023-05-30

快捷导航

登录 后使用快捷导航
没有帐号? 注册

发新话题 回复该主题

[老狼] [老狼][源码分享]----按顺序获取窗口句柄----被城管追赶的第六天... [复制链接]

1#
帖子说明:今天有人问了如何按下面图片示意1-9顺序获取句柄,然后我进入了深思

  • 自带Window插件中Search、SearchEx;大漠EnumWindow命令获取的句柄均为乱序
  • 1-9窗口是提问人随意摆的,并程序非打开的对应顺序,也无法通过程序打开的次序及对应PID获取句柄


思路1:

  • 获取窗口左上角图标的所有坐标,这样会返回9个坐标,在通过361窗口插件或大漠插件获取指定坐标的句柄



  • 结论:可这样一个问题,图片被挡住了怎么办,我进入了牛角尖,然后我想了思路2

思路2:
获取所有句柄,然后得到窗口左上角坐标,然后双for进行排序
  1. HwndEx = Plugin.Window.SearchEx(0,"记事本",0)
  2. MyArray = Split(HwndEx, "|")
  3. For i=0 to UBound(MyArray)-1
  4. sRect = Plugin.Window.GetClientRect(MyArray(i))
  5. 左上 = Split(sRect, "|")
  6. 左= Clng(左上(0)): 上 = Clng(左上(1))
  7. TracePrint "第 " & i + 1 & " 个窗口句柄为:" & MyArray(i) & "x坐标" & 左 & ",y坐标" & 上
  8. 重组信息=重组信息& MyArray(i)&"-"&左&","&上&"|"
  9. Next
  10. 重组信息= "|"&重组信息
  11. TracePrint 重组信息
  12. Sub tx()
  13. TracePrint now()
  14. TracePrint "1"
  15. For x = 1 To 1920
  16. For y = 1 To 1080
  17. If instr(重组信息,"-"& x & "," & y) > 0 Then
  18. TracePrint x&","&y
  19. TracePrint Split(split(重组信息,"-"&x&","&y)(0),"|")(1)
  20. End If
  21. Next
  22. Next
  23. TracePrint now()
  24. End Sub
  25. Call tx()
复制代码

  • 结论:速度很慢,没卵用,所以有了思路3
思路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
  1. t1 = Plugin.Sys.GetTime()
  2. HwndEx = Plugin.Window.SearchEx(0,"记事本",0)
  3. MyArray = Split(HwndEx, "|")
  4. For i=0 to UBound(MyArray)-1
  5. sRect = Plugin.Window.GetClientRect(MyArray(i))
  6. 左上 = Split(sRect, "|")
  7. 左 = Clng(左上(0)) : 上 = Clng(左上(1)) :下 = Clng(左上(3))
  8. 斜边 = (左 ^ 2 + 上 ^ 2) ^ 0.5
  9. 高度 = 下 - 上
  10. // TracePrint "第 " & i + 1 & " 个窗口句柄为:" & MyArray(i) & "x坐标" & 左 & ",y坐标" & 上
  11. If i = UBound(MyArray) - 1 Then
  12. 句柄信息 = 句柄信息 & MyArray(i)
  13. 斜边信息 = 斜边信息 & 斜边
  14. Y信息 = Y信息 & 上
  15. 窗口高度 = 窗口高度 & 高度
  16. Else
  17. 句柄信息 = 句柄信息 & MyArray(i) & "|"
  18. 斜边信息 = 斜边信息 & 斜边 & "|"
  19. Y信息 = Y信息 & 上 & "|"
  20. 窗口高度 = 窗口高度 & 高度 & "|"
  21. End If
  22. Next

  23. TracePrint 句柄排序(斜边信息, Y信息, 句柄信息,窗口高度)

  24. TracePrint CStr(Plugin.Sys.GetTime() - t1) +"毫秒"
  25. Function 句柄排序(data, str, hwnd,height)
  26. Dim 句柄重组
  27. data = Split(data, "|")
  28. yData = Split(str, "|")
  29. hwndData = Split(hwnd, "|")
  30. heightData = Split(height, "|")
  31. For i = 0 To UBound(data)-1
  32. For j = i + 1 To UBound(data)
  33. If CInt(data(i)) > CInt(data(j)) Then
  34. temp = data(j)
  35. data(j) = data(i)
  36. data(i) = temp

  37. temphwnd = hwndData(j)
  38. hwndData(j) = hwndData(i)
  39. hwndData(i) = temphwnd

  40. tempy = yData(j)
  41. yData(j) = yData(i)
  42. yData(i) = tempy

  43. End If
  44. Next
  45. Next

  46. For i = 0 To UBound(yData)-1
  47. For j = i + 1 To UBound(yData)
  48. If CInt(yData(i)) > CInt(yData(j)) and abs(CInt(yData(i)) - CInt(yData(j))) > CInt(heightData(i)) / 2 Then
  49. temphwnd = hwndData(j)
  50. hwndData(j) = hwndData(i)
  51. hwndData(i) = temphwnd
  52. End If
  53. Next
  54. Next

  55. For i = 0 To UBound(hwndData)
  56. If i = UBound(hwndData) Then
  57. 句柄重组 = 句柄重组 & hwndData(i)
  58. Else
  59. 句柄重组 = 句柄重组 & hwndData(i) & "|"
  60. End If
  61. Next
  62. 句柄排序 = 句柄重组
  63. End Function
复制代码

最后编辑瑞祥幽冥狼 最后编辑于 2022-02-28 00:33:45
本主题由 超级版主 瑞祥幽冥狼 于 2022/3/25 21:35:05 执行 审核帖子 操作
收 徒 索 引 ← ← ← ← ← ← ← ← ← ← 点 击

个 人 Q Q 1 : 1 2 2 3 1 1 6 6 1 8[将满]
个 人 Q Q 2 : 6 1 7 0 9 5 5 4 3[可加]
2#

6666666666666666666666

3#


4#

我看看

5#


6#


7#

GetProcessTimes系统api了解下

脚本定制,欢迎咨询QQ: 2692863915
8#

谢谢Thanks♪(・ω・)ノ

9#

先回复再说

10#


11#

dashen66654

12#

66666666666666666

13#

厉害 学习一下

14#

11111111111111

15#

{:5_129:}{:5_129:}{:5_129:}{:5_129:}{:5_129:}

16#

模拟器可以用吗

发新话题 回复该主题