【发布时间】:2013-08-05 07:37:41
【问题描述】:
我有一个显示一本书的窗口。在下面的两个较小的框中,有打开的书的页码和卷信息。我可以通过以下方式轻松获取该信息:
ControlGetText, volume, ThunderRT6TextBox3
ControlGetText, page, ThunderRT6TextBox2
然后我的脚本使我的鼠标指针移动到一个按钮。它单击它,并弹出一个新窗口。在那个窗口中,有更多与图书相关的文本信息,例如出版商、作者姓名、版本等。我想检索该信息。但是当我尝试相同的策略时它不起作用,例如:
ControlGetText, data, RichTextWndClass3
这两种情况的唯一区别是这两个小框是可编辑的,你可以输入文本而这个窗口是静态的。
我尝试了许多其他选项,例如:
SendEvent ^a
这相当于control + a,应该选择所有内容。我尝试暂停,但它永远不会选择。我尝试使用脚本手动双击该窗口。它起作用了,一个词就这样被选中了。即使这样 SendEvent ^a 也不做任何事情。
但是,如果我执行 SendEvent ^{insert},则所选单词会被复制到我的剪贴板。
我尝试了更多组合:
ControlSend ahk_class ThunderRT6FormDC, ^a
ControlSend ClassNN RichTextWndClass3, ^a
和
ControlSend ThunderRT6FormDC, ^a
ControlSend RichTextWndClass3, ^a
它们都不起作用。所有文本选择都不会显示在该窗口中。
剩下的唯一选择是让脚本手动选择整个文本。但是,这是缓慢且非常荒谬的。此外,在 Window Spy 下的部分:可见窗口文本中,文本都在那里。我尝试了许多其他可能性,但我已经无能为力了。我如何直接收获该文本?
编辑—— 窗口文本显示在 Window Spy 中的标题下:TitleMatchMode=slow Visible Text,而不是标题:Visible Window Text
编辑—— 我和你谈过两个窗户。我得到卷和页码的第一个。第二个需要通过按下按钮弹出。 这两个窗口都有相同的类名: ahk_class ThunderRT6MDIForm 这有什么问题吗?
编辑—— 结论是我不可能直接从第二个窗口获取该文本。因此,我选择了蹩脚、无聊的手动方法。我将 {shift down} 发送到活动窗口,然后在窗口底部单击。然后我将选择保存到我的剪贴板。它有效,但它只是愚蠢的。请帮我找到一个比这个更优雅的解决方案。
这是我使用的代码:
ControlGetText, volume, ThunderRT6TextBox3
ControlGetText, page, ThunderRT6TextBox2
Click, 110, 70
sleep 1000
SendInput {shift down}
click 29, 490
SendInput {shift up}
sleep 1000
SendInput, ^{ins}
sleep 100
有趣的是,真正的键盘键,例如 a b c 是不可能的。但我可以发送 ctrl、shift 和 ins。正如我上面提到的,^c 也给出了问题,就像 ^a 给出了问题一样。
【问题讨论】:
-
Window spy 在查找特定控件时有时会不准确。如果文本列在 窗口文本 下,则说明您的卡片不错。有两种方法: 1) 使用WinGet, Outputvar, ControlList 循环遍历窗口公开的每个控件,以查找哪些控件包含所需的文本。 2) 使用
WinGetText检索文本并提取您需要的内容。我推荐 1) 因为它更准确。 -
谢谢。我从您给我的链接中选择了第四个选项。它给了我一个包含所有信息的持久窗口,大约 8 个项目。所有这些都对应于 Window Spy 所说的内容。只有一个事件我找不到,它被称为 tabstripwendclass1 或类似的东西。另外,我必须更正我在帖子中的声明,文本显示在 Window Spy 中的标题下:TitleMatchMode=slow Visible Text not the heading Visible Window Text.
-
最后,我不明白我应该如何通过该工具找到包含所需文本的正确控件。是否应该在列表顶部显示我正在用鼠标循环?它不会改变,除非我改变整个窗口。
-
这是一个很长的镜头,但尝试三次单击窗口,看看它是否选择了整个文本
-
让我这样说吧:不要使用 Window Spy,因为它无法满足您的需求。此外,我从不建议使用示例 #4 或文档中的任何其他不连贯代码。第 1 步:检索带有
WinGet, myList, ControlList ...的 ControlList 第 2 步:循环该列表:Loop, Parse, myList, `n, `r第 3 步:在循环内部,检查每个控件,例如:ControlGetText, myText, % A_LoopField ...第 4 步:以某种方式显示信息,例如:@ 987654332@
标签: autohotkey