无忧启动论坛

 找回密码
 注册
搜索
系统gho:最纯净好用系统下载站广告联系 微信:wuyouceo QQ:184822951
查看: 1790|回复: 46
打印 上一主题 下一主题

求助获取窗口句柄的好工具?用了两个spy工具都没获取出来

[复制链接]
跳转到指定楼层
1#
发表于 2024-7-5 17:28:34 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
如图,用了两个版本的spy工具,获取的父窗口句柄都是1707D2, 我想获取“亲,您已经学了30分钟了,点击确定继续学习..” 这个对话框的句柄,然后通过程序自动判断,当出现这个对话框的时候就自动点击确定(这个对话框大约30分钟左右弹出一次),       请教大神我该怎么办?单位老是要求这样的学习很烦人,所以想找个挂机学习的方法。

..png (462.2 KB, 下载次数: 36)

..png

点评

按键精灵,可以不?是底层能取的  发表于 2024-7-5 20:27
2#
发表于 2024-7-5 17:36:41 | 只看该作者
用鼠标点击工具,每30多分钟的时候在屏幕的这个坐标点一下就行,没必要找窗口!

点评

万一没出来这个对话框,点一下就会停止播放了 ;所以必须先判断有没有这个对话框,有对话框再点击。  详情 回复 发表于 2024-7-5 17:47
回复

使用道具 举报

3#
发表于 2024-7-5 17:39:30 来自手机 | 只看该作者
脚本10分钟循环输入一次回车就好了

点评

什么脚本 ? JavaScript ? 我不会啊,能否详细说下  详情 回复 发表于 2024-7-5 17:48
回复

使用道具 举报

4#
 楼主| 发表于 2024-7-5 17:47:20 | 只看该作者
eyf 发表于 2024-7-5 17:36
用鼠标点击工具,每30多分钟的时候在屏幕的这个坐标点一下就行,没必要找窗口!

万一没出来这个对话框,点一下就会停止播放了 ;所以必须先判断有没有这个对话框,有对话框再点击。

点评

按回车会暂停播放,再按一次会再次播放吗?  详情 回复 发表于 2024-7-5 18:51
回复

使用道具 举报

5#
 楼主| 发表于 2024-7-5 17:48:17 | 只看该作者
ppll-2030 发表于 2024-7-5 17:39
脚本10分钟循环输入一次回车就好了

什么脚本 ? JavaScript ?   我不会啊,能否详细说下
回复

使用道具 举报

6#
发表于 2024-7-5 18:01:07 | 只看该作者
我的理解是:spy++这种是取windows系统应用程序的弹出窗口,所有有句柄之类,而你要取的窗口是浏览器中wed页面的弹出拟态窗口,这种是不属于windows操作系统程序的窗口,所以是取不到窗口属性的。
回复

使用道具 举报

7#
发表于 2024-7-5 18:25:24 | 只看该作者
winform使用你现有工具就可以。但是webform,只能用js注入了。

点评

能否稍详细说说, 或说下思路  详情 回复 发表于 2024-7-5 18:37
回复

使用道具 举报

8#
 楼主| 发表于 2024-7-5 18:37:10 | 只看该作者
lbw2007 发表于 2024-7-5 18:25
winform使用你现有工具就可以。但是webform,只能用js注入了。

能否稍详细说说, 或说下思路
回复

使用道具 举报

9#
发表于 2024-7-5 18:38:24 来自手机 | 只看该作者
下班才玩,晚了点,周一早点玩

点评

期待着您周一的回复  详情 回复 发表于 2024-7-5 18:43
回复

使用道具 举报

10#
发表于 2024-7-5 18:39:34 | 只看该作者
likeyouli 发表于 2024-7-5 17:48
什么脚本 ? JavaScript ?   我不会啊,能否详细说下

VBS就可以啦。把下面代码保存为vbs文件,打开视频后运行即可。
  1. x=inputbox("输入循环次数")
  2. Set ws = CreateObject("WScript.Shell")
  3. For i = 1 To x
  4. wscript.sleep 600000            '设置的是10分钟,1000表示1秒
  5. ws.sendkeys("{enter}")          '模拟输入回车键
  6. next
复制代码



点评

您怎么能判定是不是弹出对话框了呢 ?如果没有弹出对话框,发送回车键可能会使视频暂停了。 就算弹出对话框了,经我测试,直接按回车没用,按空格或其他键也没用,必须鼠标点击确定才能继续播放,如果点晚了,点击  详情 回复 发表于 2024-7-5 18:47
回复

使用道具 举报

11#
 楼主| 发表于 2024-7-5 18:43:03 | 只看该作者
szwp 发表于 2024-7-5 18:38
下班才玩,晚了点,周一早点玩

期待着您周一的回复
回复

使用道具 举报

12#
 楼主| 发表于 2024-7-5 18:47:51 | 只看该作者
本帖最后由 likeyouli 于 2024-7-5 19:10 编辑
ppll-2030 发表于 2024-7-5 18:39
VBS就可以啦。把下面代码保存为vbs文件,打开视频后运行即可。

弹出对话框后,经我测试,直接按回车没用,按空格或其他键也没用,必须鼠标点击确定才能继续播放,如果点晚了,点击确定后还必须再点一下屏幕或按空格键才能继续播放。
回复

使用道具 举报

13#
发表于 2024-7-5 18:51:01 | 只看该作者
likeyouli 发表于 2024-7-5 17:47
万一没出来这个对话框,点一下就会停止播放了 ;所以必须先判断有没有这个对话框,有对话框再点击。

按回车会暂停播放,再按一次会再次播放吗?

点评

刚测试了一下,播放的时候:按回车没反应,按空格键暂停,再按空格键继续播放。  详情 回复 发表于 2024-7-5 19:06
回复

使用道具 举报

14#
 楼主| 发表于 2024-7-5 19:06:54 | 只看该作者
holley2008 发表于 2024-7-5 18:51
按回车会暂停播放,再按一次会再次播放吗?

刚测试了一下,播放的时候:按回车没反应,按空格键暂停,再按空格键继续播放。
回复

使用道具 举报

15#
发表于 2024-7-5 19:32:56 | 只看该作者
这个能不能查询到窗口? 窗口查询.zip (993.69 KB, 下载次数: 20)

点评

好像也不是,见图,难道弹出的这个对话框真的像前边楼层说的没有句柄 ? 多说句,win11的屏幕截图太气人了,功能是强大了,但图片上老是截取不到鼠标位置,win10的话按print键就能轻松截取整个屏幕(包括鼠标  详情 回复 发表于 2024-7-6 09:33
zyy
谢谢分享,下载试试看  详情 回复 发表于 2024-7-5 20:32
回复

使用道具 举报

16#
发表于 2024-7-5 20:02:21 | 只看该作者
likeyouli 发表于 2024-7-5 18:47
弹出对话框后,经我测试,直接按回车没用,按空格或其他键也没用,必须鼠标点击确定才能继续播放,如果点 ...

你试试在弹出对话框后,你点击对话框的标题栏,使窗口处于激活置顶状态,再按回车有没有没反应?
如果是这种情况,可以加一句ws.appactivate("消息") 激活窗口,再输出确认。

点评

肯定是激活状态测试的,这点我还懂。  详情 回复 发表于 2024-7-6 09:36
回复

使用道具 举报

17#
发表于 2024-7-5 20:32:40 | 只看该作者
527104427 发表于 2024-7-5 19:32
这个能不能查询到窗口?

谢谢分享,下载试试看
回复

使用道具 举报

18#
发表于 2024-7-5 23:40:52 | 只看该作者
wuyou.7z (12.9 KB, 下载次数: 17)
回复

使用道具 举报

19#
发表于 2024-7-6 07:23:03 | 只看该作者
spy++是不可能获取网页控件的句柄的,获取了也没用。
按键精灵有多点取色的功能,每间隔一段时间,全屏查找确定这个关键字的颜色点,找到了就点击确定。

点评

谢谢超版的指点, 在b站找了按键精灵教程,估计要研究一段时间了 想法:估计每次弹出对话框的位置应该是一样的(如果每次弹出的对话框位置不同,后边的判断将不成立),所以在弹出对话框这个区域内,多取几个点的  详情 回复 发表于 2024-7-6 11:59
回复

使用道具 举报

20#
 楼主| 发表于 2024-7-6 09:33:20 | 只看该作者
527104427 发表于 2024-7-5 19:32
这个能不能查询到窗口?

好像也不是,见图,难道弹出的这个对话框真的像前边楼层说的没有句柄 ?
      多说句,win11的屏幕截图太气人了,功能是强大了,但图片上老是截取不到鼠标位置,win10的话按print键就能轻松截取整个屏幕(包括鼠标位置),为了使图片上显示鼠标的位置,无奈我用手机拍的照片,这图就是我用手机拍的。

2.jpg (476.13 KB, 下载次数: 28)

2.jpg
回复

使用道具 举报

21#
 楼主| 发表于 2024-7-6 09:36:07 | 只看该作者
本帖最后由 likeyouli 于 2024-7-6 09:48 编辑
ppll-2030 发表于 2024-7-5 20:02
你试试在弹出对话框后,你点击对话框的标题栏,使窗口处于激活置顶状态,再按回车有没有没反应?
如果是 ...

肯定是激活状态测试的,这点我还懂。顺便向您展示一下我写的微信自动聊天代码(VBA):laopo替换为自己的微信好友账号,可以是备注名字,不能是汉字。
Sub 微信自动发信息()
Set ws = CreateObject("wscript.shell")
For N = 1 To 3
ws.SendKeys "^%w", True
Application.Wait (Now() + TimeSerial(0, 0, 2))
ws.SendKeys "^f", True
Application.Wait (Now() + TimeSerial(0, 0, 3))
ws.SendKeys "laopo", True
Application.Wait (Now() + TimeSerial(0, 0, 3))
ws.SendKeys "{enter}", True
Application.Wait (Now() + TimeSerial(0, 0, 2))
DoEvents
ws.SendKeys "Zidongfasong" & N, True
DoEvents
Application.Wait (Now() + TimeSerial(0, 0, 3))
ws.SendKeys "^~", True
Application.Wait (Now() + TimeSerial(0, 0, 2))
ws.SendKeys "{ESC}", True
Application.Wait (Now() + TimeSerial(0, 0, 1))
Next N
End Sub


回复

使用道具 举报

22#
发表于 2024-7-6 09:43:42 | 只看该作者
干的漂亮666
回复

使用道具 举报

23#
发表于 2024-7-6 09:53:34 | 只看该作者
这东西。。。有的框架通过spy工具是抓不到的。
先测试无脑的办法,就是假如此视频窗口在没有弹窗的状态下,发送Enter到窗口是否会造成视频暂停等问题。如果没有以为状况出现,那么测试出现弹窗后Enter键是否可以消除弹窗!如果可以,那么隔段时间直接给窗口发Enter键即可。
然后有点儿技术的办法,就是如果各种方法都无效,那么脚本OCR窗口,然后鼠标跟随点击即可!

点评

播放的时候:按回车键没用,按空格键可以暂停,再按空格键继续播放; 弹出对话框的时候:按啥键都没用,必须鼠标点击确定。(有时候点击完确定也不能继续播放,必须再按一下空格键才能继续播放。)  详情 回复 发表于 2024-7-6 10:09
回复

使用道具 举报

24#
 楼主| 发表于 2024-7-6 10:09:25 | 只看该作者
moonlune 发表于 2024-7-6 09:53
这东西。。。有的框架通过spy工具是抓不到的。
先测试无脑的办法,就是假如此视频窗口在没有弹窗的状态下 ...

播放的时候:按回车键没用,按空格键可以暂停,再按空格键继续播放;
弹出对话框的时候:按啥键都没用,必须鼠标点击确定。(有时候点击完确定也不能继续播放,必须再按一下空格键才能继续播放。)
回复

使用道具 举报

25#
发表于 2024-7-6 11:17:36 | 只看该作者
likeyouli 发表于 2024-7-6 10:09
播放的时候:按回车键没用,按空格键可以暂停,再按空格键继续播放;
弹出对话框的时候:按啥键都没用, ...

嗯,所以你这个简单的办法,就是用基于浏览器自动化的软件进行使用,此类软件有的是基于浏览器扩展的,有的是软件中包含浏览器框架。
其次估计就是进行窗口OCR,以前曾遇到过此类,什么办法都无用,最终发现OCR点击其实也挺好用的。
回复

使用道具 举报

26#
发表于 2024-7-6 11:46:58 | 只看该作者
本帖最后由 ppll-2030 于 2024-7-6 11:48 编辑
likeyouli 发表于 2024-7-6 09:36
肯定是激活状态测试的,这点我还懂。顺便向您展示一下我写的微信自动聊天代码(VBA):laopo替换为自己的 ...

你那个发信息也是快捷键激活了程序窗口并置顶,才操作的。
vbs也只能对真正激活并置顶的对象使用sendkeys,所以一些弹窗,但不置顶的窗口需要act一下才是激活置顶。
按你的这个情况,这个提醒窗口可能不是真正的弹窗置顶提醒,应该是网页子窗口,同时还不对键盘支持。
我是没辙了,建议尝试用其他鼠标脚本工具来操作了。
我常用的MacroRecorder可以检测图片和色块功能,你可以试试。
回复

使用道具 举报

27#
 楼主| 发表于 2024-7-6 11:59:55 | 只看该作者
liuzhaoyzz 发表于 2024-7-6 07:23
spy++是不可能获取网页控件的句柄的,获取了也没用。
按键精灵有多点取色的功能,每间隔一段时间,全屏查 ...

谢谢超版的指点,
在b站找了按键精灵教程,估计要研究一段时间了
想法:估计每次弹出对话框的位置应该是一样的(如果每次弹出的对话框位置不同,后边的判断将不成立),所以在弹出对话框这个区域内,多取几个点的颜色,过一段时间,在同样的位置再取颜色,如果与之前取的颜色相等,即判定出弹出了对话框,然后鼠标点击确定。

点评

找色或者找图,可以全屏查找,不一定要在某个位置,可以全屏幕找色找图。 按键精灵里面有大量的例子。 VBSCall FindPic(42,513,321,697,"训养.bmp",1,x4,y4) VBSCall FindColor(x1-408,y1,x1+230,y1+479,"42498  详情 回复 发表于 2024-7-6 15:11
回复

使用道具 举报

28#
发表于 2024-7-6 13:20:00 | 只看该作者
有能力的大佬这么多,无忧太强大了
回复

使用道具 举报

29#
发表于 2024-7-6 13:58:52 | 只看该作者
来学习
回复

使用道具 举报

30#
发表于 2024-7-6 15:08:46 | 只看该作者
用VBS写这个东西,必须查询进程的CPU占用率,由于播放时CPU占用会大一些,所以,你可以判断CPU较低的时候就是跳出弹窗的时候。

  1.         while CPU_busy >5: wscript.sleep 5000:Wend '如果CPU忙或者硬盘忙则等待
  2.         ......

  3. Function CPU_busy() 'CPU使用率
  4.     dim objProc
  5.     Set objProc = GetObject("winmgmts:\\.\root\cimv2:win32_processor='cpu0'")
  6.     CPU_busy=objProc.LoadPercentage 'CPU使用率
  7.     Set objProc = nothing
  8. End Function


  9. Class SetMouse
  10.         private S
  11.         private xls, wbk, module1
  12.         private reg_key, xls_code, x, y
  13.          Private Sub Class_Initialize()
  14.                 Set xls = CreateObject("Excel.Application")
  15.                 Set S = CreateObject("wscript.Shell")
  16.                 reg_key = "HKEY_CURRENT_USER\Software\Microsoft\Office\$\Excel\Security\AccessVBOM"        'vbs 完全控制excel
  17.                 reg_key = Replace(reg_key, "$", xls.Version)
  18.                 S.RegWrite reg_key, 1, "REG_DWORD"
  19.                 xls_code = _
  20.                 "Private Type POINTAPI : X As Long : Y As Long : End Type" & vbCrLf & _
  21.                 "Private Declare Function SetCursorPos Lib ""user32"" (ByVal x As Long, ByVal y As Long) As Long" & vbCrLf & _
  22.                 "Private Declare Function GetCursorPos Lib ""user32"" (lpPoint As POINTAPI) As Long" & vbCrLf & _
  23.                 "Private Declare Sub mouse_event Lib ""user32"" Alias ""mouse_event"" " _
  24.                 & "(ByVal dwFlags As Long, ByVal dx As Long, ByVal dy As Long, ByVal cButtons As Long, ByVal dwExtraInfo As Long)" & vbCrLf & _
  25.                 "Public Function getx() As Long" & vbCrLf & "Dim pt As POINTAPI : GetCursorPos pt : getx = pt.X" & vbCrLf & _
  26.                 "End Function" & vbCrLf & "Public Function gety() As Long" & vbCrLf & _
  27.                 "Dim pt As POINTAPI: GetCursorPos pt : gety = pt.Y" & vbCrLf & "End Function"
  28.                 Set wbk = xls.Workbooks.Add:Set module1 = wbk.VBProject.VBComponents.Add(1):module1.CodeModule.AddFromString xls_code
  29.         End Sub
  30.         '关闭
  31.         Private Sub Class_Terminate
  32.                 on error resume next
  33.                         xls.DisplayAlerts = False:wbk.Close:xls.Quit
  34.                 on error goto 0
  35.         End Sub
  36.         '可调用过程
  37.         Public Sub getpos( x, y):x = xls.Run("getx"):y = xls.Run("gety"):End Sub
  38.         Public Sub move(x,y):wscript.Sleep 50:xls.Run "SetCursorPos", x, y:wscript.Sleep 300:End Sub
  39.         Public Sub wheel_y(y) '鼠标滚轮上或下滚动y距离
  40.                 'for wheel=1 to (y/10)
  41.                         wscript.Sleep 30
  42.                         'xls.Run "mouse_event", &H800, 0, 0, (y/10), 0
  43.                         xls.Run "mouse_event", &H800, 0, 0, y, 0
  44.                         wscript.Sleep 30
  45.                 'next
  46.                 wscript.Sleep 300
  47.         End Sub
  48.         Public Sub wheel_x(x) '鼠标滚轮上或下滚动x距离
  49.                 'for wheel=1 to (x/10)
  50.                         wscript.Sleep 30
  51.                         xls.Run "mouse_event", &H800, 0, 0, x, 0
  52.                         wscript.Sleep 30
  53.                 'next
  54.                 wscript.Sleep 300
  55.         End Sub
  56.         Public Sub clik(keydown)
  57.                 wscript.Sleep 80
  58.                 Select Case UCase(keydown)
  59.                         Case "LEFT"'点左键
  60.                         xls.Run "mouse_event", &H2 + &H4, 0, 0, 0, 0
  61.                         Case "RIGHT"'点右键
  62.                         xls.Run "mouse_event", &H8 + &H10, 0, 0, 0, 0
  63.                         Case "MIDDLE"'点中键
  64.                         xls.Run "mouse_event", &H20 + &H40, 0, 0, 0, 0
  65.                         Case "LDOWN"'按下左键
  66.                         xls.Run "mouse_event", &H2, 0, 0, 0, 0
  67.                         Case "RDOWN"'按下右键
  68.                         xls.Run "mouse_event", &H8, 0, 0, 0, 0
  69.                         Case "MDOWN"'按下中键
  70.                         xls.Run "mouse_event", &H20, 0, 0, 0, 0
  71.                         Case "LUP"'弹起左键
  72.                         xls.Run "mouse_event", &H4, 0, 0, 0, 0
  73.                         Case "RUP"'弹起右键
  74.                         xls.Run "mouse_event", &H10, 0, 0, 0, 0
  75.                         Case "MUP"'弹起中键
  76.                         xls.Run "mouse_event", &H40, 0, 0, 0, 0
  77.                         Case "DBCLICK"'双击
  78.                         xls.Run "mouse_event", &H2 + &H4, 0, 0, 0, 0
  79.                         xls.Run "mouse_event", &H2 + &H4, 0, 0, 0, 0
  80.                 End Select
  81.                 wscript.Sleep 300
  82.         End Sub
  83. End Class

  84. Function clik_left(str) '在特定位置点鼠标左键
  85.         dim mouse_x,mouse_y,mouse_delay,clik_arg
  86.         str=split(str,",")
  87.         mouse_delay=0
  88.         for clik_arg=0 To UBound(str)-LBound(str)
  89.                 if clik_arg=0 then mouse_x=str(0)
  90.                 if clik_arg=1 then mouse_y=str(1)
  91.                 if clik_arg=2 then mouse_delay=str(2)
  92.         next
  93.         Set mouse=New SetMouse
  94.         wscript.Sleep 50
  95.         mouse.move mouse_x,mouse_y
  96.         wscript.Sleep 50
  97.         while CPU_busy >4 or Hard_busy >10240: wscript.sleep 200:Wend '忙则等
  98.         mouse.clik "LEFT"
  99.         wscript.Sleep 50 + mouse_delay
  100.         Set mouse=nothing
  101. End Function
复制代码

点评

非常感谢,, 可惜我不会vbs,我只会点vba,按您的思路,通过vba调用api函数,或vba调用cmd,通过查看cpu或内存占用大小,判断是否正在播放。如果没有播放,通过api,使鼠标在屏幕特定位置单击,实在不行,再用我写  详情 回复 发表于 2024-7-6 15:34
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

小黑屋|手机版|Archiver|捐助支持|无忧启动 ( 闽ICP备05002490号-1 )

闽公网安备 35020302032614号

GMT+8, 2024-10-18 13:34

Powered by Discuz! X3.3

© 2001-2017 Comsenz Inc.

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