보호되어 있는 글입니다.
내용을 보시려면 비밀번호를 입력하세요.

PC와 iPad 를 USB 모드로 연결후에 AHK를 구동하면 아이패드 또한 제어가 가능하다.

이 부분에서는 ClassNN 을 알 수 없기 때문에, 다음과 같이 PID 를 잡아 접근한다.


안녕하세요, 간만에 들릅니다.

한창 포스트메시지에 열공하던때가있었는데,, 갑자기 쓸일이 있어서 보니 윈도우에 ClassNN이 없더군요..

이런 안습이!! 하고 공부하던중 ContorlClick을 쓰면 될까해서 써봤더니 되더군요.. 허무한..

controlclick, x892 y403, 윈도우타이틀

타이틀만으로도 ClassNN을 알수없는 창에 클릭메시지를 보낼수있었습니다.

클릭 이외에 다른메시지는 보내보진않았습니다만 조금 특이한점이있더군요

ClassNN을 알수없는 윈도에 포스트메시지를 프로세스 아이디를 잡아서 하니 메시지가 가긴합니다만

목적윈도우가 한번이라도 활성화되면 입력이 중단되더군요.

PostMessage, 0X200, 0, %N%,, ahk_pid 2500

변수 N은 좌표주소입니다. 귀찬아서 변수로..

위처럼 프로세스 아이디로 하니 ClassNN없이 윈도우타이틀만 적었을때는 전혀 작동하지 않던 것이

작동을 합니다. 다만 활성화되면 멈추긴하지만..

흥미로운점은 Controlclick과 포스트메시지를 혼용해서 쓰니 포스트메시지가 정상적으로 작동합니다. ClassNN없이도..

활성되었다가 비활성되도 여전히 작동되더군요. 

더욱 흥미로운점은 Controlclick보다 메시지가 끊김없이 전송된다는점.. 

저의 실험기기는 아이패드였습니다만.. 다른것도 비슷하지않을까 ^^;

ClassNN을 알수없는 윈도우에 한번써보세요~

'AUTOHOTKEY' 카테고리의 다른 글

iPad 에서도 구동이 가능하다!  (0) 2019.02.22
ControlSend 와 Nox에 관한 고찰  (0) 2019.02.22
IniRead, IniWrite, IniDelete  (0) 2019.02.20
Line number in listbox  (0) 2019.02.20
ControlGet 에 관한 고찰  (0) 2019.02.20
GetText from ListBox  (0) 2019.02.20
블로그 이미지

remoted

Remoted's IT LAB & POST DATABASE

댓글을 달아 주세요

비활성의 개념을 12-1강에서 잡았으면, 드디어 비활성 입력을 사용해야 할 때가 왔다.
사실 강좌를 하기  막막할 정도로 어렵고, 한 번에 이해가 힘든 부분이라서 걱정이다. 이럴 때일수록 특히 필요한 게, 직접 해보는 자세이다.
 강좌만 읽는 건 그냥 소설책을 읽는 것과 다름없다. 그게 도움이 되려면, 직접 해보는 것이 상당히 큰 도움이 될 테니 지금 모바일로 보고 계신 분들은 컴퓨터 앞에 앉으셨으면 좋겠다. (물론, 한번 쭉 읽고 이해가 간다면 큰 문제없겠지만, 이 경우도 한 번쯤 해보는 것이 좋다.)

비활성 보내기, ControlSend
명령어의 이름 중 익숙한 부분이 있다. 바로 Send인데, 여기까지 왔으면 Send 정도는 사용할 수 있을 거라 본다. ControlSend는 이름에서 알 수 있듯이 Send의 비활성 버전이다. Send와 같은 역할을 하지만, 그것을 비활성 상태로 진행한다는 것이다. 기본적인 문법(파라미터)부터 살펴보도록 하겠다.

ControlSend [, Control, Keys, WinTitle, WinText, ExcludeTitle, ExcludeText]

보자마자 히익 소리가 절로 나올 것이다. 지금까지 나온 명령어 중에서 가장 파라미터가 복잡하다 해도 과언이 아니기 때문이다. 하지만 평상시 쓰이는 비활성 보내기 작업에서는 저렇게까지 필요 없다. 3번째 파라미터, 즉 Wintitle 부분까지만 알면 충분하다.
따라서 이번 강좌에서는 Wintitle 파라미터까지만 안내하도록 하겠다. 나머지 부분은, 필자도 쓰지 않는다.

첫 번째 파라미터인 Control은, 이름만 들어도 복잡해 보인다. 프로그램이 '동네'라면 컨트롤은 '집 주소'이다. 원하는 곳에 택배를 보낼 때 주소를 정확히 확인하는 것처럼, 원하는 부분에 값을 보낼 때는 그 부분(컨트롤)의 이름(ClassNN)을 정확히 써주어야 한다. 말이 상당히 어려운데, 다음 그림을 보자.

사진 12-2-1: 비활성 보내기의 작동 방식

비활성 보내기는 다음과 같은 구조로 이루어져 있다. '타이틀'이라는 프로그램에 있는 '어떠한 컨트롤'의 이름으로 값을 보내면, 그 어떠한 컨트롤 내에 그 값이 보내지는 것이다. ClassNN은 컨트롤의 이름이다. 가볍게 아래와 같이 생각하자.

음, 이 물건 받으실 주소는.. 서울시 타이틀구 컨트롤동 클래스(ClassNN)씨 앞이네요?

자 다시, 파라미터 까먹었을 테니 다시 보자. 필요 없는 파라미터는 잘라내었다.

ControlSend [, Control, Keys, WinTitle]

그러면 첫 번째 파라미터에는 프로그램의 컨트롤 이름, 즉 ClassNN을 써주어야 한다. 직접 해봐야 하므로, 실험 도구로 메모장을 선택하겠다.  원래 우리가 짰던 스크립트는 Send, Hello World 라고 할 때, 이 명령어를 비활성 명령어로 만들어보자.

사진 12-2-2

위 사진과 같이 클래스는 Window Spy로 알아낼 수 있다. 좌표를 찾듯이 찾아주면 되는데, 사진에서 밝게 표시한 곳이 ClassNN이다. 즉, 컨트롤의 이름이다. 메모장의 입력창 위치에 마우스를 대면 ClassNN이 Edit1로 표시된다. 메모장의 입력창 ClassNN 바로 Edit1 것이다! 이렇게 여러 프로그램들의 ClassNN을 심심할 때마다 찾아보는 것도 재미있다.  PC 카카오톡 대화 입력 창만해도 RichEdit20W1이라는 아주 긴 ClassNN를 갖고 있다. 그러므로, 아래 스크립트는 다음과 같이 변한다

/* Send, Hello World 이 문장은 아래 문장처럼 변할 수 있음 */ ControlSend, Edit1, Hello World

하지만 우리에겐 타이틀명이란 것도 필요하다위에서 택배 보내기 예제가 나왔는데,  만약 받는 주소에 "데브실님 "이라고만 써져있으면 택배를 보낼  있을 리가 없다전국에 데브실이라는 이름이 어디 있을  알고 이렇게만 적는가? "어디 사는 누구"라고 정확히 적어야 한다그래서  "어디 사는" 적어주려고 한다"어디 사는" 타이틀이라고 한다.

컴퓨터 세계에서 이것은 "어느 타이틀에 사는 컨트롤" 바꿀  있다역시 Window Spy에서 알아낼  있지만, Spy 최상단에 써져있으므로 사진은 생략한다미국은 한국어랑 어법이 반대라고 했던가컴퓨터는 서양 물건이므로 순서도 "주소에 사는 받는사람씨" 아닌 "받는 사람 주소에 사는"으로 적어야 한다 클래스가 타이틀이 뒤로 와야 한다.

Controlsend, Edit1, Hello World, 제목 없음 - 메모장 ;[제목 없음 - 메모장] 동네에 사는 [Edit1]씨에게 Hello World를 보내라!

재생 가능 시간이 만료되었습니다.
페이지 새로고침 후 다시 실행해 주시기 바랍니다.

  

동영상 12-2-1 (15MB)

좌측은 메모장, 우측은 SciTE를 연 후 실험했다. 활성화된 창은 분명 SciTE임에도 불구하고, 메모장에 정상적으로 문자를 보내고 있다. 덤으로 {Enter}와 같은 키도 잘 보내진다.

만약 받는 사람이 없으면 집주소로만, 즉 타이틀로만 보낼 수도 있다. 클래스가 없는 경우에는 타이틀로만 보낼 수가 있는데, 다음과 같이 쓸 수 있다.

ControlSend,, Hello World, 제목없음 - 메모장

쉼표 2 찍은 것은 오타가 아니다원래   개의 쉼표 사이에 클래스가 들어가야 하지만클래스를 비워준 것일 뿐이다.
요약
- Controlsend,컨트롤명,보낼 내용,타이틀
컨트롤명과 타이틀은 Window Spy에서 구할  있다.
타이틀   띄어쓰기 구분
포함관계타이틀 > 컨트롤 >= ClassNN(클래스)







'AUTOHOTKEY' 카테고리의 다른 글

iPad 에서도 구동이 가능하다!  (0) 2019.02.22
ControlSend 와 Nox에 관한 고찰  (0) 2019.02.22
IniRead, IniWrite, IniDelete  (0) 2019.02.20
Line number in listbox  (0) 2019.02.20
ControlGet 에 관한 고찰  (0) 2019.02.20
GetText from ListBox  (0) 2019.02.20
블로그 이미지

remoted

Remoted's IT LAB & POST DATABASE

댓글을 달아 주세요

SAVE: 
ControlGet, GetListBox_List, List,, Listbox1, A 

IniRead, QT, Set.ini, Common, QT, 0 

Loop, % QT 
  IniDelete, Set.ini, Common, %A_Index% 

Loop, Parse, GetListBox_List,`n 

  SetQT := A_Index 
  IniWrite, %A_LoopField%, Set.ini,Common, %A_Index% 

iniWrite, %SetQT%, Set.ini,Common, QT 
Return 

LOAD: 
GuiControl,,검색어리스트,| 
IniRead, QT, Set.ini, Common, QT, 0 

SetList := "" 
Loop, % QT 

  IniRead, GetList , Set.ini, Common, %A_Index% 
  SetList .= GetList "|" 

StringTrimRight, SetList, SetList , 1 
GuiControl,,검색어리스트,%SetList% 
Return 



리스트박스 안에서 개체를 선택하고, 삭제하고 등등의 역할을 할 수 있는데 위와 같은 방법으로 Listbox 를 다루다가는 굉장히 더러워지고 접근이 어려워지게 된다.


보다 좋은 방책은 ListView 를 사용하는 것인데, 이 안에서는 매우 다양한 함수를 이용하여 데이터를 가공하고 저장할 수 있게 해놨다.



Multi옵션으로 복수 선택가능으로 하고 있는 경우, 아래와 같이 해 모든 항목을 선택·선택 해제할 수 있다.

Gui +LastFound  ; Avoids the need to specify WinTitle below.
If(V)
    PostMessage, 0x185, 1, -1, ListBox1  ; Select all items. 0x185 is LB_SETSEL.
else
    PostMessage, 0x185, 0, -1, ListBox1  ; Deselect all items.




'AUTOHOTKEY' 카테고리의 다른 글

iPad 에서도 구동이 가능하다!  (0) 2019.02.22
ControlSend 와 Nox에 관한 고찰  (0) 2019.02.22
IniRead, IniWrite, IniDelete  (0) 2019.02.20
Line number in listbox  (0) 2019.02.20
ControlGet 에 관한 고찰  (0) 2019.02.20
GetText from ListBox  (0) 2019.02.20
블로그 이미지

remoted

Remoted's IT LAB & POST DATABASE

댓글을 달아 주세요

Line number in listbox

AUTOHOTKEY 2019. 2. 20. 20:42
DataLife
  • Members
  • 1022 posts
      •  Last active: Nov 27 2015 01:09 AM
      • Joined: 27 Apr 2008
      I need to get the highlighted line number in listbox.

      I am using the g label for one thing and the v associated variable for another so altsubmit won't work for me.

      I know that double click puts the line number in A_EventInfo but I want to highlight a row of text then click a control button to use that text for something else.

      How can I retrieve the line number?

      thanks
      DataLife 
      SKAN
      • Administrators
      • 9115 posts
          •  Last active:
          • Joined: 26 Dec 2005

          How can I retrieve the line number?


          You may send LB_GETCURSEL message to the ListBox Control

          Gui, Add, ListBox, w100 R9 hWndLB1,  ABC|DEF|GHI|JKL|MNO|PQR|STU|VWX|YZ
          Gui, Add, Button, w100 gGetLineNumber, Get Line Number
          Gui, Show,,
          Return
          
          GetLineNumber:
           SendMessage,(LB_GETCURSEL := 0x188),0,0,, ahk_id %LB1%
           LineNumber := ErrorLevel+1
           MsgBox %LineNumber%
          Return

          :) 
          kWo4Lk1.png
          DataLife
          • Members
          • 1022 posts
              •  Last active: Nov 27 2015 01:09 AM
              • Joined: 27 Apr 2008
              You are correct. I found a post by Chris that used LB_GETCURSEL. It works great.

              Any chance you know how to send a single click to a highlighted row in listbox?

              Either that or make the listbox active again after I refresh the contents. I have to click on the listbox to be able to scroll with the arrow keys.

              thanks again.
              DataLife 
              DataLife
              • Members
              • 1022 posts
                  •  Last active: Nov 27 2015 01:09 AM
                  • Joined: 27 Apr 2008
                  I found the answer to my previous question.

                  I can use controlfocus to make the listbox the active control again.
                  So simple, I found it in the documentation looking for something else.
                  example:

                  ControlFocus, Listbox1


                  thanks

                  DataLife 


                  고전적인 ListBox 의 문제점 중 하나는, Line number 나 Data를 얻어 올 수 있지만 "상태에 의해 제약받는다" 는 점이 있다.
                  그 상태에 대해선 3가지 부류가 있는데.. 결론은 Selected 상태여야 한다는 것으로 귀결된다.
                   


                  'AUTOHOTKEY' 카테고리의 다른 글

                  ControlSend 와 Nox에 관한 고찰  (0) 2019.02.22
                  IniRead, IniWrite, IniDelete  (0) 2019.02.20
                  Line number in listbox  (0) 2019.02.20
                  ControlGet 에 관한 고찰  (0) 2019.02.20
                  GetText from ListBox  (0) 2019.02.20
                  ControlGet  (0) 2019.02.20
                  블로그 이미지

                  remoted

                  Remoted's IT LAB & POST DATABASE

                  댓글을 달아 주세요

                  List

                  Retrieves a list of items from a ListView, ListBox, ComboBox, or DropDownList. For ListView, additional options can be specified.

                  ControlGet, OutputVar, List , Options, Control, WinTitle, WinText, ExcludeTitle, ExcludeText


                  위에 함수원형의 Prototype 을 살펴보자.  5번째 Argument 에 Control 이 위치하도록 되어있다. 신기하게도 이 부분에서 Control 에 대해서 특별한 언급이 없는 경우에, v 로 지정하는 Label 로 써 구분짓는 것이 아닌, ListBox 의 생성순서에 따라서, ListBox1 과 같은 Control 의 이름을 따른다.

                  이것은 Win32 API, MFC 를 따르는 전통적인 관례다.

                  예제 소스를 보자!


                  ControlGet, GetListBox_List, List,, ListBox1, A 
                  ;ListBox1 means the First ListBox
                  IniRead, QT, Set.ini, Common, QT, 0 

                  Loop, % QT 
                    IniDelete, Set.ini, Common, %A_Index% 

                  Loop, Parse, GetListBox_List,`n 
                    SetQT := A_Index 
                    IniWrite, %A_LoopField%, Set.ini,Common, %A_Index% 
                  iniWrite, %SetQT%, Set.ini,Common, QT 

                  ListBox1 부분에 특희 유념할 것!

                  ListView

                  If the Options parameter is blank or omitted, all the text in the control is retrieved. Each row except the last will end with a linefeed character (`n). Within each row, each field (column) except the last will end with a tab character (`t).

                  Specify for Options zero or more of the following words, each separated from the next with a space or tab:

                  SelectedRetrieves only the selected (highlighted) rows rather than all rows. If none, OutputVar is made blank.
                  FocusedRetrieves only the focused row. If none, OutputVar is made blank.
                  Col4Retrieves only the fourth column (field) rather than all columns (replace 4 with a number of your choice).
                  CountRetrieves a single number that is the total number of rows in the control.
                  Count SelectedRetrieves the number of selected (highlighted) rows.
                  Count FocusedRetrieves the row number (position) of the focused row (0 if none).
                  Count ColRetrieves the number of columns in the control (or -1 if the count cannot be determined).

                  Note: Some applications store their ListView text privately, which prevents their text from being retrieved. In these cases, ErrorLevel will usually be set to 0 (indicating success) but all the retrieved fields will be empty. Also note that ListView text retrieval is not restricted by #MaxMem.

                  Upon success, ErrorLevel is set to 0. Upon failure, it is set to 1 and OutputVar is made blank. Failure occurs when: 1) the target window or control does not exist; 2) the target control is not of type SysListView32; 3) the process owning the ListView could not be opened, perhaps due to a lack of user permissions or because it is locked; 4) the ColNoption specifies a nonexistent column.

                  To extract the individual rows and fields out of a ListView, use a parsing loop as in this example:

                  ControlGet, SelectedItems, List, Selected, SysListView321, WinTitle
                  Loop, Parse, SelectedItems, `n  ; Rows are delimited by linefeeds (`n).
                  {
                      RowNumber := A_Index
                      Loop, Parse, A_LoopField, %A_Tab%  ; Fields (columns) in each row are delimited by tabs (A_Tab).
                          MsgBox Row #%RowNumber% Col #%A_Index% is %A_LoopField%.
                  }

                  On a related note, the columns in a ListView can be resized via SendMessage as shown in this example:

                  SendMessage, 4126, 0, 80, SysListView321, WinTitle  ; 4126 is LVM_SETCOLUMNWIDTH.

                  In the above, 0 indicates the first column (specify 1 for the second, 2 for the third, etc.) Also, 80 is the new width. Replace 80 with -1 to autosize the column. Replace it with -2 to do the same but also take into account the header text width.

                  ListBox, ComboBox, DropDownList

                  All the text is retrieved from the control (that is, the ListView options above such as Count and Selected are not supported).

                  Each item except the last will be terminated by a linefeed character (`n). To access the items individually, use a parsing loop as in this example:

                  ControlGet, Items, List,, ComboBox1, WinTitle
                  Loop, Parse, Items, `n
                      MsgBox Item number %A_Index% is %A_LoopField%.


                  'AUTOHOTKEY' 카테고리의 다른 글

                  IniRead, IniWrite, IniDelete  (0) 2019.02.20
                  Line number in listbox  (0) 2019.02.20
                  ControlGet 에 관한 고찰  (0) 2019.02.20
                  GetText from ListBox  (0) 2019.02.20
                  ControlGet  (0) 2019.02.20
                  ListBox Count  (0) 2019.02.20
                  블로그 이미지

                  remoted

                  Remoted's IT LAB & POST DATABASE

                  댓글을 달아 주세요

                  GetText from ListBox

                  AUTOHOTKEY 2019. 2. 20. 02:39
                  David Andersen
                  • Guests
                    •  Last active:
                    • Joined: --
                    I really need to read the text in a ListBox. My script is as follows:
                    #x::
                    SendMessage, 0x189, 2, 0, WindowsForms10.LISTBOX.app.0.378734a1, Form1
                    if ErrorLevel <> FAIL
                    {
                    MsgBox, %ErrorLevel%
                    }

                    Where 0x189 refers to the following MSDN function:
                    http://msdn.microsof... ... ettext.asp

                    at least according to http://www.codeguru.... ... .php/c2771

                    Anyways... My problem is that this returns the length of the string in the listbox (this is in accordance with the description of LB_GETTEXT on MSDN. My quesiton is how I could retreave the content that lParam is pointing at after this sendmessage function.

                    The following is a link to an .exe file that made in Visual Studio 2005 beta 2 (hope it works for you), containing the listbox that I am trying to retreave the text from. http://www.translati...ds.com/demo.exe.

                    Thanks 


                    Chris
                    • Administrators
                    • 10727 posts
                        •  Last active:
                        • Joined: 02 Mar 2004

                        I really need to read the text in a ListBox.

                        Have you tried "ControlGet, List"? This is a relatively recent feature that gets a complete list of items from a ListBox, ComboBox, or DropDownList. 
                        David Andersen
                        • Guests
                          •  Last active:
                          • Joined: --
                          Thanks for the replay, Chris.

                          I have tried the following script:
                          ControlGet, List, List,, WindowsForms10.LISTBOX.app.0.378734a1, Form1 
                          Loop, Parse, List, `n
                          {
                          MsgBox Item number %A_Index% is %A_LoopField%.
                          }

                          Unfortunatelly, I did not receive any output at all. 

                          While I got a message box saying "5" with the following script:
                          SendMessage, 0x189, 2, 0, WindowsForms10.LISTBOX.app.0.378734a1, Form1 
                          if ErrorLevel <> FAIL 

                          MsgBox, %ErrorLevel% 
                          }

                          5 represents the number of characters in this entry in the list. 
                          Chris
                          • Administrators
                          • 10727 posts
                              •  Last active:
                              • Joined: 02 Mar 2004
                              ControlGet is only designed to work with standard ListBoxes and ComboBoxes. Yours control seems like a non-standard (custom) control, which might explain why it doesn't work.

                              Although I'm all out of ideas, I hope you find a solution or that someone else comes along who knows something. 


                              그렇다! Chris 의 말대로라면 ControlGet 은 standard ListBoxes and ComboBoxes 에 디자인된 것이다. (어쨋든 여기서 필자의 요구조건은 충족시키므로 패스!)



                              더욱 흥미로운 Chris 의 발언들을 살펴보자!


                              David Andersen
                              • Guests
                                •  Last active:
                                • Joined: --
                                I understand. The control that I am using is the standard one used by Visual Studio 2005 (although, I am using the beta 2 version).

                                Although I don't know C++ I found the method that would need some adjustments to make it possible to receive the text. Its name is ScriptSendMessage and it is located in Script2.cpp. This method uses the MSDN method SendMessageTimeout (http://msdn.microsoft.com/library/defau ... ettext.asp).

                                Are there any C++ experts out there that knows how to implement this?

                                Thanks a lot in advance. 
                                Chris
                                • Administrators
                                • 10727 posts
                                    •  Last active:
                                    • Joined: 02 Mar 2004
                                    I don't see how any internal changes to SendMessage would help in this case. The "ControlGet List" method I mentioned
                                    earlier already uses LB_GETTEXT internally. If it fails to work on a custom ListBox, you would have to find out what
                                    messages to send to that particular type of ListBox to get the text out of it.

                                    Microsoft Active Accessibility might be able to extract text from many types of custom controls, but I don't know much
                                    else about it yet. 

                                    ControlGet List method 는 내부적으로 LB_GETTEXT 를 사용한다고 되어있다. 그렇다는 것은 DllCall 에 의해서도 충분히 얻어질 수 있다는 것이다!


                                    이와같이 말이다.


                                    LBCount := DllCall("SendMessage", "uint", hIDLB, "uint", 0x18B) ;LB_GETCOUNT




                                    David Andersen
                                    • Members
                                    • 140 posts
                                        •  Last active: Jun 28 2011 04:54 PM
                                        • Joined: 15 Jul 2005
                                        Thank you a lot for your help. I have sent you 10 dollars to your email address to show my appreciation.

                                        I have a far more general question now. Is it in principle possible to extract the text from any listbox or combobox? I understand that i.e. Java programs are build up in a totally different way, so my question is just about the programs that show up as listboxes in AU3_Spy.

                                        I really need to read text from a range of listboxes where the one at http://www.translati...ds.com/demo.exe is an example of one of them. I think that all the listboxes I want to read from have been programmed in Visual Studio.

                                        I have also thought about using OCR technology to "read" the text off the screen, but this is a really dirty way to solve the problem so I hope there are other possibilities.

                                        Thanks again. 
                                        Chris
                                        • Administrators
                                        • 10727 posts
                                            •  Last active:
                                            • Joined: 02 Mar 2004

                                            Is it in principle possible to extract the text from any listbox or combobox?

                                            Since any custom control can arbitrarily contain the word ListBox or ComboBox in its name, I would have to say "no".
                                            An application can be designed to store its text privately and draw it on the screen only as needed. In such a case, there
                                            would be no external/direct access to the text (other than something fairly difficult such as ReadProcessMemory).

                                            I have also thought about using OCR technology to "read" the text off the screen

                                            This may be the best approach in this case. Here is a nice command line OCR tool that daonlyfreez recently posted:
                                            Optical Character Recognition (OCR) - gocr [CLI] 



                                            'AUTOHOTKEY' 카테고리의 다른 글

                                            IniRead, IniWrite, IniDelete  (0) 2019.02.20
                                            Line number in listbox  (0) 2019.02.20
                                            ControlGet 에 관한 고찰  (0) 2019.02.20
                                            GetText from ListBox  (0) 2019.02.20
                                            ControlGet  (0) 2019.02.20
                                            ListBox Count  (0) 2019.02.20
                                            블로그 이미지

                                            remoted

                                            Remoted's IT LAB & POST DATABASE

                                            댓글을 달아 주세요

                                            ControlGet

                                            AUTOHOTKEY 2019. 2. 20. 01:44

                                            Retrieves various types of information about a control.

                                            ControlGet, OutputVar, SubCommand , Value, Control, WinTitle, WinText, ExcludeTitle, ExcludeText

                                            Parameters

                                            OutputVar
                                            The name of the variable in which to store the result of SubCommand.
                                            SubCommand, Value
                                            These are dependent upon each other and their usage is described below.
                                            Control

                                            Can be either ClassNN (the classname and instance number of the control) or the control's text, both of which can be determined via Window Spy. When using text, the matching behavior is determined by SetTitleMatchMode. If this parameter is blank, the target window's topmost control will be used.

                                            To operate upon a control's HWND (window handle), leave the Control parameter blank and specify ahk_id %ControlHwnd% for the WinTitle parameter (this also works on hidden controls even when DetectHiddenWindows is Off). The HWND of a control is typically retrieved via ControlGet HwndMouseGetPos, or DllCall.

                                            WinTitle
                                            A window title or other criteria identifying the target window. See WinTitle.
                                            WinText
                                            If present, this parameter must be a substring from a single text element of the target window (as revealed by the included Window Spy utility). Hidden text elements are detected if DetectHiddenText is ON.
                                            ExcludeTitle
                                            Windows whose titles include this value will not be considered.
                                            ExcludeText
                                            Windows whose text include this value will not be considered.

                                            Sub-commands

                                            For SubCommand, specify one of the following:

                                            • List: Retrieves a list of items from a ListView, ListBox, ComboBox, or DropDownList.
                                            • Checked: Retrieves 1 if the checkbox or radio button is checked or 0 if not.
                                            • Enabled: Retrieves 1 if the control is enabled, or 0 if disabled.
                                            • Visible: Retrieves 1 if the control is visible, or 0 if hidden.
                                            • Tab: Retrieves the tab number of a SysTabControl32 control.
                                            • FindString: Retrieves the entry number of a ListBox or ComboBox that is an exact match for the string.
                                            • Choice: Retrieves the name of the currently selected entry in a ListBox or ComboBox.
                                            • LineCount: Retrieves the number of lines in an Edit control.
                                            • CurrentLine: Retrieves the line number in an Edit control where the caret resides.
                                            • CurrentCol: Retrieves the column number in an Edit control where the caret resides.
                                            • Line: Retrieves the text of the specified line number in an Edit control.
                                            • Selected: Retrieves the selected text in an Edit control.
                                            • Style: Retrieves an 8-digit hexadecimal number representing the style of the control.
                                            • ExStyle: Retrieves an 8-digit hexadecimal number representing the extended style of the control.
                                            • Hwnd [v1.1.04+]: Retrieves the window handle (HWND) of the control.
                                            해석에 유의해야한다. List 부분에서 a list of items 를 반환한다고 되어있다.  

                                            List

                                            Retrieves a list of items from a ListView, ListBox, ComboBox, or DropDownList. For ListView, additional options can be specified.

                                            ControlGet, OutputVar, List , Options, Control, WinTitle, WinText, ExcludeTitle, ExcludeText

                                            ListView

                                            If the Options parameter is blank or omitted, all the text in the control is retrieved. Each row except the last will end with a linefeed character (`n). Within each row, each field (column) except the last will end with a tab character (`t).

                                            Specify for Options zero or more of the following words, each separated from the next with a space or tab:

                                            SelectedRetrieves only the selected (highlighted) rows rather than all rows. If none, OutputVar is made blank.
                                            FocusedRetrieves only the focused row. If none, OutputVar is made blank.
                                            Col4Retrieves only the fourth column (field) rather than all columns (replace 4 with a number of your choice).
                                            CountRetrieves a single number that is the total number of rows in the control.
                                            Count SelectedRetrieves the number of selected (highlighted) rows.
                                            Count FocusedRetrieves the row number (position) of the focused row (0 if none).
                                            Count ColRetrieves the number of columns in the control (or -1 if the count cannot be determined).

                                            Note: Some applications store their ListView text privately, which prevents their text from being retrieved. In these cases, ErrorLevel will usually be set to 0 (indicating success) but all the retrieved fields will be empty. Also note that ListView text retrieval is not restricted by #MaxMem.

                                            Upon success, ErrorLevel is set to 0. Upon failure, it is set to 1 and OutputVar is made blank. Failure occurs when: 1) the target window or control does not exist; 2) the target control is not of type SysListView32; 3) the process owning the ListView could not be opened, perhaps due to a lack of user permissions or because it is locked; 4) the ColNoption specifies a nonexistent column.

                                            To extract the individual rows and fields out of a ListView, use a parsing loop as in this example:

                                            ControlGet, SelectedItems, List, Selected, SysListView321, WinTitle
                                            Loop, Parse, SelectedItems, `n  ; Rows are delimited by linefeeds (`n).
                                            {
                                                RowNumber := A_Index
                                                Loop, Parse, A_LoopField, %A_Tab%  ; Fields (columns) in each row are delimited by tabs (A_Tab).
                                                    MsgBox Row #%RowNumber% Col #%A_Index% is %A_LoopField%.
                                            }

                                            On a related note, the columns in a ListView can be resized via SendMessage as shown in this example:

                                            SendMessage, 4126, 0, 80, SysListView321, WinTitle  ; 4126 is LVM_SETCOLUMNWIDTH.

                                            In the above, 0 indicates the first column (specify 1 for the second, 2 for the third, etc.) Also, 80 is the new width. Replace 80 with -1 to autosize the column. Replace it with -2 to do the same but also take into account the header text width.

                                            ListBox, ComboBox, DropDownList

                                            All the text is retrieved from the control (that is, the ListView options above such as Count and Selected are not supported).

                                            컨트롤(개체)로부터 모든 텍스트가 반환되어진다. 즉, ListView의 옵션들 (Count 그리고 Selected 같은 것은 지원되지 않는다)


                                            Each item except the last will be terminated by a linefeed character (`n). To access the items individually, use a parsing loop as in this example:


                                            마지막을 제외한 각각의 아이템들은 Linefeed Character (`n) 문자에 의해서 구분지어진다. 각각의 아이템들에 접근하기 위해, 다음과 같은 parsing loop 를 사용해본다.

                                            ControlGet, Items, List,, ComboBox1, WinTitle
                                            Loop, Parse, Items, `n
                                                MsgBox Item number %A_Index% is %A_LoopField%.


                                            'AUTOHOTKEY' 카테고리의 다른 글

                                            IniRead, IniWrite, IniDelete  (0) 2019.02.20
                                            Line number in listbox  (0) 2019.02.20
                                            ControlGet 에 관한 고찰  (0) 2019.02.20
                                            GetText from ListBox  (0) 2019.02.20
                                            ControlGet  (0) 2019.02.20
                                            ListBox Count  (0) 2019.02.20
                                            블로그 이미지

                                            remoted

                                            Remoted's IT LAB & POST DATABASE

                                            댓글을 달아 주세요