2013-08-05 4 views
2

나는 책을 보여주는 창이있다. 아래 두 개의 작은 상자에는 열려있는 책의 페이지 번호와 볼륨 정보가 있습니다. 그 정보는 다음과 같이 쉽게 얻을 수 있습니다.창에서 텍스트 내용을 얻는 방법

내 스크립트는 마우스 포인터를 버튼으로 이동시킵니다. 클릭하면 새로운 창이 열립니다. 이 창에는 게시자, 이름 작성자, 판 등 책과 관련된 텍스트 정보가 더 있습니다. 그 정보를 검색하고 싶습니다. 나는이 같은 전략을 시도 할 때이 예를 들어, 작동하지 않는 :이 창은 정적 인 반면

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-- 윈도우의 텍스트가 제목 아래에 윈도우 스파이로 보여줍니다 TitleMatchMode = 느린 보이는 텍스트, NOT 제목 : 눈에 보이는 창 텍스트


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 및 In을 보낼 수 있습니다. 위에서 언급했듯이,^c는^a가 문제를 제기하는 것처럼 문제를 제시하고있었습니다.

+1

창 스파이 때로는 부정확 특정 컨트롤 찾기. 텍스트가 * 창 텍스트 * 아래에 나열되어 있으면 좋은 카드를 가지고 있습니다. 두 가지 방법이 있습니다 : 1) 윈도우가 [WinGet, Outputvar, ControlList] (http://www.autohotkey.com/docs/commands/WinGet.htm)를 사용하여 노출하는 각 컨트롤을 루프하여 어떤 컨트롤이 포함되어 있는지 확인하십시오 원하는 텍스트 2) 'WinGetText'로 텍스트를 검색하고 필요한 것을 추출하십시오. 나는 그것이 더 정확하기 때문에 1)을 추천한다. – MCL

+0

감사. 네가 준 링크에서 네 번째 옵션을 선택했다. 그것은 나에게 8 개의 항목에 관한 모든 정보가있는 지속적인 창을 제공합니다. 이 모든 것은 윈도우 스파이가 말하는 것과 일치합니다. 찾을 수없는 이벤트가 하나뿐입니다.이 이벤트는 tabstripwendclass1 또는 이와 비슷한 이벤트입니다. 또한, 내 게시물에 내 주장을 수정해야합니다, 텍스트 제목에 창 스파이에 표시 : TitleMatchMode = 느린 표시 텍스트 제목 텍스트 표시되지 않습니다. – Khalil

+0

마지막으로,이 도구를 사용하여 원하는 텍스트가 포함 된 올바른 컨트롤을 찾는 방법을 제대로 이해하지 못합니다. 목록 맨 위에 내 마우스로 반복하고 있다고 표시되어 있습니까? 창 전체를 변경하는 경우를 제외하고는 변경되지 않습니다. – Khalil

답변

1

대부분의 윈도우 스파이 로직을 에뮬레이션하는 자동 핫키 스크립트가 있습니다. AHK_Window_Info_v1.7.ahk라고합니다. 좋은 점은 ... 두 번째 창 텍스트가이 스크립트에서 볼 수 있는지 확인하기 위해 실행할 수 있으며, 그렇다면 ... 정보를 가져 오는 데 필요한 논리를 스크립트 내에서 사용할 수 있습니다. 다음은 웹 페이지에 대한 링크이며 해당 페이지의 SKANs 보관 용 계정 링크를 통해 스크립트를 사용할 수 있습니다. 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 
} 
관련 문제