2013-08-05 67 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 
}