我有一个专有软件,我用它从互联网上下载一些机密数据,这个软件是访问这些数据的唯一方法。
软件打开屏幕,然后我必须点击"下载"并开始下载。我想每晚深夜(比如0200小时)下载这些数据。缺点是我必须坐在笔记本电脑前面,然后点击“#34;在下载按钮上。
所以,我编写了一个AutoIt脚本来打开软件,等待30秒,以便软件完成初始化程序,然后"转到"屏幕上的某个位置(坐标)并执行" mouseclick()"。然后我创建了一个"计划任务"使用Windows任务计划程序在0200小时运行此自动执行程序。正如预期的那样,每件事都很好。
当用户“活跃”时,自动执行程序运行良好。但是如果用户被锁定了#34; (即锁定屏幕)然后它被卡在" WinActivate()"等待用户成为" Active"并在用户变为“活跃”后从那里继续恢复。这意味着笔记本电脑必须在一夜之间处于解锁模式,出于安全考虑,这是不可取的。然后我发现我可以使用" ControlClick()"屏幕锁定时也一样。
我现在的问题是,当我使用AutoIt窗口信息工具时,当我将鼠标悬停在下载按钮上时,它不会显示CLASS或与下载按钮相关的任何信息。所以,屏幕可能是一个闪光屏或其他有意识的东西,以确保没有看到按钮CLASS!
一个选项是截取屏幕截图,找到位置,然后将坐标发送到Mouseclick(),但考虑到不同机器上的不同屏幕分辨率(如果将其移植到另一台机器等等),这可能会变得更加复杂)
有什么建议和解决方案吗?
答案 0 :(得分:1)
WinActivate()将等到激活用户激活窗口然后返回并且在这种情况下它是一个阻塞函数,所以要避免它。将VB应用程序保留在后台,而不是最小化并删除WinActivate()函数。 ControlClick不需要激活窗口。
这应该适用于正确的句柄名称和类名:
HotKeySet("!{s}", "_exit")
Local $count = 0
Local $handle
While $count < 3
Sleep(5000)
$handle = ControlGetHandle("name", "", "[CLASS:ThunderRT6FormDC]") ;add name as well if there is one
If $handle Then ;check if handle exists
ConsoleWrite("Handle exists" & @LF)
ControlClick($handle, "", "[CLASS:Classhere]", "left", 1, 191, 115) ;add a class if exists
EndIf
ConsoleWrite("Try: " & $count & " times" & @LF)
$count += 1
WEnd
Func _exit()
ConsoleWrite("Exiting!" & @LF & "Tried: " & $count & @LF)
Exit
EndFunc
您从自动信息工具中提供的信息是不够的。使用其他工具获取更多信息。 Spy ++是一个很棒的工具。尝试一下,然后返回有关Windows句柄名称和类的更多信息。
您再次提供有关您的代码的一些信息。此示例应执行控件单击,但除了winactivate之外,您可能还有其他功能会再次阻止您的脚本
编辑:添加了Tesseract OCR UDF:http://www.autoitscript.com/forum/topic/89542-tesseract-screen-ocr-udf/