2013-08-05 33 views
2

我有一个显示书籍的窗口。在下面的两个较小的框中,打开书的页码和卷信息。我可以很容易地得到这些信息如下:如何从窗口中获取文本内容

ControlGetText, volume, ThunderRT6TextBox3  
ControlGetText, page, ThunderRT6TextBox2 

然后我的脚本让我的鼠标指针移动到一个按钮。它点击它,并打开一个新窗口。在那个窗口中,有更多与本书相关的文本信息,例如发布者,姓名作者,版本等。我想检索这些信息。但是,当我尝试同样的策略,它不工作,如:

ControlGetText, data, RichTextWndClass3

两种情况之间的唯一区别是,这两个小箱子是可编辑的,你可以,而这个窗口是静态的输入文字。

我尝试了很多其他选项,如: SendEvent ^a 这相当于控制+ a,它应该选择所有内容。我尝试了暂停,但它永远不会选择。我试着脚本手动双击该窗口。它的工作原理,一个词就是这样的选择。即使那么SendEvent^a也不会做任何事情。 但是,如果我做SendEvent^{插入},那么选定的单词将被复制到我的剪贴板。

我尝试用更多的组合:

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

ControlSend ThunderRT6FormDC, ^a 
ControlSend RichTextWndClass3, ^a 

没有他们的工作。所有文本选择都不会在该窗口中显示。

剩下的唯一替代方法是让脚本对整个文本进行手动选择。但是,这很慢很荒谬。而且,在Window Spy的“可见窗口文本”部分下,文本全部存在。我尝试了很多其他的可能性,并且我处于最后的智慧之中。我如何直接收集文本?


EDIT-- 窗口的文本显示在窗口间谍标题下:TitleMatchMode =慢可见文本,而不是标题:可视窗口文本


EDIT-- 我说话给你两个窗口。第一个我得到的数量和页码。第二个需要按下按钮弹出。 这两个窗口具有相同的类名称: ahk_class ThunderRT6MDIForm 这是有问题的任何方式吗?


EDIT-- 的结论是,这是不可能的,我直接得到第二个窗口的文本。因此,我选择了这种蹩脚的,无聊的手动方法。我向移动窗口发出{shift shift},然后在窗口底部单击鼠标。然后我将选择保存到我的剪贴板。它工作,但它是愚蠢的。请帮我找一个比这个更优雅的解决方案。

这是我使用的代码:

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和一个插件。正如我上面提到的,^ c也给出了问题,就像^ a提供了问题。

+1

窗口间谍有时是不准确的,当谈到找到具体的控制。如果文本在*窗口文本*下列出,则表示您的卡片很好。有两种方法:1)使用[WinGet,Outputvar,ControlList](http://www.autohotkey.com/docs/commands/WinGet.htm)循环显示窗口暴露的每个控件,以查找哪些控件包含所需的文字。 2)用'WinGetText'检索文本并提取你需要的内容。我建议1),因为它更准确。 – MCL

+0

谢谢。我从你给我的链接中选择了第四个选项。它给我一个持续的窗口,包含所有的信息,大约8项。所有这些都对应于Window Spy所说的内容。只有一个事件我无法找到,它被称为tabstripwendclass1或类似的东西。另外,我必须在我的帖子中更正我的声明,文本显示在Window Spy的标题下:TitleMatchMode =缓慢可见文本,而不是标题可见窗口文本。 – Khalil

+0

最后,我不明白我应该如何通过该工具找到包含所需文本的正确控件。是否应该在列表顶部显示我正在用鼠标循环播放?它不会改变,除非我改变整个窗口。 – Khalil

回答

1

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

0

这个程序会做获取并从活动窗口返回下面的文字部分的工作: - 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 
}