Autohotkey 如何从窗口获取文本内容

Autohotkey 如何从窗口获取文本内容,autohotkey,Autohotkey,我有一个显示一本书的窗口。在下面两个较小的框中,有打开的书的页码和卷信息。我可以通过以下方式轻松获得这些信息: ControlGetText, volume, ThunderRT6TextBox3 ControlGetText, page, ThunderRT6TextBox2 然后我的脚本使我的鼠标指针移动到一个按钮。它点击它,一个新窗口弹出。在该窗口中,有更多与该书相关的文本信息,如出版商、作者姓名、版本等。我想检索这些信息。但当我尝试相同的策略时,它不起作用,例如: Cont

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

ControlGetText, volume, ThunderRT6TextBox3      
ControlGetText, page, ThunderRT6TextBox2
然后我的脚本使我的鼠标指针移动到一个按钮。它点击它,一个新窗口弹出。在该窗口中,有更多与该书相关的文本信息,如出版商、作者姓名、版本等。我想检索这些信息。但当我尝试相同的策略时,它不起作用,例如:

ControlGetText,数据,RichTextWndClass3

这两种情况之间的唯一区别是,这两个小框是可编辑的,您可以输入文本,而此窗口是静态的

我尝试了许多其他选择,例如:
SendEvent^a
这相当于control+a,它应该选择所有内容。我试着暂停,但它永远不会选择。我尝试用脚本手动双击该窗口。它是有效的,一个词就这样被选中了。即使这样,SendEvent ^a也不会做任何事情。 但是,如果我执行SendEvent ^{insert},则所选单词将被复制到剪贴板

我尝试了更多的组合:

ControlSend ahk_class ThunderRT6FormDC, ^a
ControlSend ClassNN RichTextWndClass3, ^a

它们都不起作用。所有文本选择不会显示在该窗口中

我剩下的唯一选择是让脚本手动选择整个文本。然而,这是缓慢和非常可笑的。而且,在windowspy下的部分:可见窗口文本中,所有的文本都在那里。我尝试了许多其他的可能性,我已经不知所措了。我该如何直接获取该文本


编辑-- 窗口文本在window Spy中显示在标题:TitleMatchMode=慢速可见文本下,而不是标题:可见窗口文本


编辑-- 我跟你说过有两扇窗户。第一个我得到卷和页码的。第二个需要通过按下按钮弹出。 这两个窗口具有相同的类名: ahk_类雷霆6mdiform 这有什么问题吗


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

有一个自动热键脚本,它模拟了大多数Windows spy逻辑。它被称为AHK_Window_Info_v1.7.AHK。好在。。。您可以运行它来查看您的第二个窗口文本是否对此脚本可见,如果可见。。。提取信息所需的逻辑在脚本中可用。这里是该网页的链接,该脚本可通过该网页上的SKANs dropbox链接获得

此例程将从活动窗口获取并返回以下文本部分: -EdtWindowTextFastVisible -EdtWindowTextSlowVisible -EdtWindowTextFastHidden -EDT窗口文本慢行

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
}
MyGetWindowText(ByRef EdtWindowTextFastVisible、ByRef EdtWindowTextSlowVisible、ByRef EdtWindowTextFastHidden、ByRef EdtWindowTextSlowWhidden)
{
;资料来源: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=
EDT窗口文本慢行=
WindowControlTextSize=32767
VarSetCapacity(WindowControlText、WindowControlTextSize)
WinGet,WindowUniqueID,ID,A
;由克里斯建议
WinGet,控件句柄列表,ControlListHwnd,ahk_id%WindowUniqueID%;需要v1.0.43.06+。
循环、解析、ListOfControlHandles,`n
{
text\u快:=真
如果不是DllCall(“GetWindowText”、“uint”、A_LoopField、“str”、WindowControlText、“int”、WindowControlTextSize)
{
text\u是\u fast:=false
SendMessage、0xD、WindowControlTextSize和WindowControlText、、ahk_id%A_LoopField%;0xD是WM_GETTEXT
}
如果(WindowControlText“”){
ControlGet,WindowControlStyle,Style,,,ahk_id%A_LoopField%
If(WindowControlStyle&0x10000000)
{;控件可见与隐藏(WS_可见)。
如果文本快
EdtWindowTextFastVisible=%EdtWindowTextFastVisible%%WindowControlText%%`r`n
其他的
EdtWindowTextSlowVisible=%EdtWindowTextSlowVisible%%WindowControlText%%`r`n
}否则
{;隐藏文本。
如果文本快
EdtWindowTextFastHidden=%EdtWindowTextFastHidden%%WindowControlText%%`r`n
其他的
edtWindowTextSlowIdden=%edtWindowTextSlowIdden%%WindowControlText%%`r`n
}
}
}
;EdtWindowTextFastVisibleFull:=ShowOnlyPartingUI(“EdtWindowTextFastVisible”,edtWindowTextFastVisible400)
;EdtWindowTextSlowVisibleFull:=ShowOnlyPartingUI(“EdtWindowTextSlowVisible”,edtWindowTextSlowVisible400)
;EdtWindowTextFastHiddenFull:=ShowOnlyPartingUI(“EdtWindowTextFastHidden”,EdtWindowTextFastHidden,400)
;edtWindowTextSlowIddenFull:=仅显示部分语言(“edtWindowTextSlowIdden”,edtWindowTextSlowIdden,400)
返回
}

Window spy在查找特定控件时有时不准确。如果文本列在窗口文本下,则说明您有好的卡片。有两种方法:1)循环窗口使用的每个控件,以查找包含所需文本的控件。2) 使用
WinGetText
检索文本并提取所需内容。我推荐1)因为它更准确。谢谢。我从你给我的链接中选择了第四个选项。它为我提供了一个包含所有信息的持久窗口,大约8项。全部
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
}