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' 카테고리의 다른 글

Nox 버전업에 따른 ControlClick 에 대한 대처방안  (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

비활성의 개념을 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' 카테고리의 다른 글

Nox 버전업에 따른 ControlClick 에 대한 대처방안  (0) 2019.02.22
iPad 에서도 구동이 가능하다!  (0) 2019.02.22
IniRead, IniWrite, IniDelete  (0) 2019.02.20
Line number in listbox  (0) 2019.02.20
ControlGet 에 관한 고찰  (0) 2019.02.20

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
Line number in listbox  (0) 2019.02.20
ControlGet 에 관한 고찰  (0) 2019.02.20
GetText from ListBox  (0) 2019.02.20

+ Recent posts