Autohotkey - 如何检测应用程序中的所有输入 areas/checkboxes?

Autohotkey - How to detect all input areas/checkboxes in an application?

有没有办法检测应用程序中的文本框和复选框等输入区域?我想用数字标记每个输入区域,这样我就可以使用键盘在 AHK 的输入字段之间跳转。

例如:一旦脚本被激活并且活动 window 是 Google Chrome,Chrome 的地址栏可能会标记为 #1。当我按“1”时,光标将指向该区域。

我基本上是在尝试为键盘不太友好的应用程序创建一个解决方法。

答案是肯定的,如果复选框的数量及其在应用程序中的位置是固定的,并且您知道自动化发生在哪台机器上。

请研究 ImageSearch 以了解如何从屏幕截图中找到它们。

如果您知道 window 中复选框的 X/Y 位置,您还可以使用 PixelGetColor 来检查检查是否可见。

您还应该使用随附的 AutoIt Spy 检查您的应用程序。该程序向您展示了它可以在应用程序中看到的内容 window。

要获得标签,请查看 Gui 命令。如果你让你的gui透明,不给焦点,你可以在application上面写labels。

大多数 Windows 应用程序使用标准 windows 元素。 对于这些...

https://autohotkey.com/docs/commands/WinGet.htm - 使用 ControlList 参数,获取所有标准控件的列表。 对于那些:

https://autohotkey.com/docs/commands/ControlGet.htm——可以获得控件的类型,并且

https://autohotkey.com/docs/commands/ControlGetPos.htm - 可以获取控件的位置和尺寸。

有些也可以通过COM控制:https://gist.github.com/kheybot/7026077#automation-of-office-applications


有时可以使用标准流(STDIN、STDOUT、STDERR、LPTn、PRN、NUL)直接与命令行和控制台程序通信,或者您可以使用 COM 或 WSH 与显示程序的终端通信: https://gist.github.com/kheybot/7026077#interact-with-command-line

这对许多遗留数据输入程序很重要。


浏览器(例如Chrome),不幸的是,不能使用这些重量级的组件,因为页面上可能有太多的组件,但是还有其他选项可以与它们通信,例如 COM, DDE等与DOM通讯: https://gist.github.com/kheybot/7026077#browser-automation

对于网络浏览器,我倾向于采用混合方法,将网络浏览器输入区域(地址栏等)的 AHK 处理与处理输入字段的 Greasemonkey/Tampermonkey 脚本相结合在网页本身内 - Java 脚本将比任何屏幕抓取软件都能更好地处理使用 DOM 的输入区域。还有可能使用像 Selenium 这样的功能测试套件来实现自动化,并使用浏览器的插件功能编写扩展来处理它的 UI.

这意味着您现在有两个编程问题,当然...


Java 应用程序、Flash 应用程序、HTML5 应用程序、一些图形设计软件以及几乎所有计算机游戏本质上都只是图形,无法从外部识别控件。

对于这些,您必须使用基本的屏幕抓取技术:http://www.autohotkey.com/docs/commands/ImageSearch.htm and http://www.autohotkey.com/docs/commands/PixelSearch.htm 来识别特定区域,这只能通过单独编程特定控件才能真正完成。

不过,通用检测的一个选项是让某些东西检测阴影(投影、按钮化组件等),并允许您在以这种方式检测到的组件之间切换并发送点击。不幸的是,现代扁平化设计意味着这并不总是有效,所以您也可以尝试搜索纯色矩形……除了有时它们有弯曲的角。因为平面设计师讨厌人。


在这一点上,您将希望看到这里是一个分形复杂性的无限兔子洞。

您可以制作一个简单的 ControlGet 解决方案,它不适用于您经常使用的许多应用程序...或者您可以创建一个混合方法,单独针对许多应用程序,同时尝试拥有一个通用解决方案对于无法识别的应用程序。

如果您创建它供自己使用,我想说的是让它与您熟悉和经常使用的应用程序一起工作,这就足够了。

如果您将其编写为供其他人使用的辅助功能软件,我想说的目标是让用户可以为每个应用程序配置它:让他们控制他们想要单击的输入元素以及按什么顺序,因为自动检测永远不会完美,而且很少会选择理想的解决方案。