如何从窗口获取文本内容

时间:2013-08-05 07:37:41

标签: autohotkey

我有一个显示书籍的窗口。在下面的两个较小的框中,有打开的书的页码和卷信息。我可以轻松地获得这些信息如下:

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的“可见窗口文本”部分下,文本就在那里。我尝试了很多其他的可能性,我的斗智尽头。我如何直接收获该文本?


EDIT-- 窗口文本显示在Window Spy标题下:TitleMatchMode = slow Visible Text,而不是标题:Visible Window Text


EDIT-- 我和你谈了两个窗户。第一个我得到卷和页码。第二个需要通过按下按钮弹出。 这两个窗口都具有相同的类名: ahk_class ThunderRT6MDIForm 这有什么问题吗?


EDIT-- 结论是我不可能直接从第二个窗口获取该文本。因此,我选择了蹩脚,无聊的手动方法。我向活动窗口发送{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

很有趣的是,真正的键盘键,例如b c是不可能的。但是我能够发送一个ctrl,shift和一个ins。正如我上面提到的,^ c也提出了问题,就像^ a给出问题一样。

2 个答案:

答案 0 :(得分:1)

有一个autohotkey脚本可以模拟大多数窗口间谍逻辑。它被称为AHK_Window_Info_v1.7.ahk。好处是......你可以运行它来查看你的第二个窗口文本是否对这个脚本可见,如果是这样的话......在脚本中可以获得提取信息所需的逻辑。这是一个指向该网页的链接,该脚本可通过该页面上的SKANs Dropbox链接获得。 http://www.autohotkey.com/board/topic/8204-ahk-window-info-17/

答案 1 :(得分:1)

此例程将完成从活动窗口获取和返回以下文本部分的工作:     - 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
}