【问题标题】:How to obtain textual contents from a window如何从窗口中获取文本内容
【发布时间】: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


【解决方案1】:

有一个自动热键脚本可以模拟大多数窗口间谍逻辑。它被称为 AHK_Window_Info_v1.7.ahk。好消息是...您可以运行它以查看您的第二个窗口文本是否对该脚本可见,如果是的话...提取信息所需的逻辑在脚本中可用。这是该网页的链接,该脚本可通过该页面上的 SKAN 保​​管箱链接获得。 http://www.autohotkey.com/board/topic/8204-ahk-window-info-17/

【讨论】:

    【解决方案2】:

    此例程将完成从活动窗口获取和返回以下文本部分的工作: - EdtWindowTextFastVisible - EdtWindowTextSlowVisible - EdtWindowTextFastHidden - EdtWindowTextSlowHidden

    MyGetWindowText(ByRef EdtWindowTextFastVisible, ByRef EdtWindowTextSlowVisible, ByRef EdtWindowTextFastHidden,ByRef EdtWindowTextSlowHidden)
    {
    ; Source: https://code.google.com/p/autohotkey-cn/source/browse/trunk/Source/AHK_Window_Info/AHK_Window_Info_v1.7.ahk?r=6
    EdtWindowTextFastVisible =
    EdtWindowTextSlowVisible =
    EdtWindowTextFastHidden =
    EdtWindowTextSlowHidden =
    
    WindowControlTextSize = 32767
    VarSetCapacity(WindowControlText, WindowControlTextSize)
    WinGet, WindowUniqueID, ID, A
    
    ;Suggested by Chris
    WinGet, ListOfControlHandles, ControlListHwnd, ahk_id %WindowUniqueID% ; Requires v1.0.43.06+.
    Loop, Parse, ListOfControlHandles, `n
    {
        text_is_fast := true
        If not DllCall("GetWindowText", "uint", A_LoopField, "str", WindowControlText, "int", WindowControlTextSize)
        {
            text_is_fast := false
            SendMessage, 0xD, WindowControlTextSize, &WindowControlText,, ahk_id %A_LoopField% ; 0xD is WM_GETTEXT
        }
        If (WindowControlText <> ""){
            ControlGet, WindowControlStyle, Style,,, ahk_id %A_LoopField%
            If (WindowControlStyle & 0x10000000)
            { ; Control is visible vs. hidden (WS_VISIBLE).
                If text_is_fast
                EdtWindowTextFastVisible = %EdtWindowTextFastVisible%%WindowControlText%`r`n
                Else
                EdtWindowTextSlowVisible = %EdtWindowTextSlowVisible%%WindowControlText%`r`n
            } Else
            { ; Hidden text.
                If text_is_fast
                EdtWindowTextFastHidden = %EdtWindowTextFastHidden%%WindowControlText%`r`n
                Else
                EdtWindowTextSlowHidden = %EdtWindowTextSlowHidden%%WindowControlText%`r`n
            }
        }
    }
    
    ;EdtWindowTextFastVisibleFull := ShowOnlyAPartInGui("EdtWindowTextFastVisible", EdtWindowTextFastVisible, 400)
    ;EdtWindowTextSlowVisibleFull := ShowOnlyAPartInGui("EdtWindowTextSlowVisible", EdtWindowTextSlowVisible, 400)
    ;EdtWindowTextFastHiddenFull := ShowOnlyAPartInGui("EdtWindowTextFastHidden", EdtWindowTextFastHidden, 400)
    ;EdtWindowTextSlowHiddenFull := ShowOnlyAPartInGui("EdtWindowTextSlowHidden", EdtWindowTextSlowHidden, 400)
    
    Return
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-01-31
      相关资源
      最近更新 更多