반응형

서론

 

오토핫키를 사용하여 비활성화 키보드 및 마우스 매크로를 만들기 위해서는 프로세스의 윈도우를 핸들링 해주어야합니다. 여기서 말하는 핸들링이란 무엇일까요?

 

정확히는, 윈도우 프로세스 핸들링(Window Process Handling)은 소프트웨어 개발에서 윈도우 운영 체제의 프로세스와  관련된 다양한 작업을 관리하고 제어하는 것을 의미합니다

 

 

오토핫키를 설치하면 설치파일에 같이 동봉되는 Window Spy로 확인가능합니다. 

(window Spy는 오토핫키 설치파일 폴더안에 있습니다 C드라이브 -> 프로그램파일 -> autohotkey )

각 윈도우 창마다 Title , PID 등 고유 식별코드가 있습니다. 

 

오토핫키 에서도 이를 이용한 윈도우 창의 이벤트를 확인 및 조작을 할 수 있는데 

아래와 같습니다. 

 

  • WinExist: 특정 윈도우가 존재하는지 확인합니다.
  • WinActivate: 특정 윈도우를 활성화합니다.
  • WinClose: 특정 윈도우를 종료합니다.
  • WinGet: 윈도우 정보를 가져옵니다 (예: 핸들, 제목, 프로세스 ID).
  • Process /... 명령: 프로세스를 시작하거나 종료합니다.

 

이러한 식별코드를 통해, 정확한 이벤트를 전달하기위해 윈도우 타이틀 / PID 를 사용합니다.

현재 이 강좌에서 다루려고 하는 비활성 매크로는, 

 

스크립트 코드안에 특정 창의 윈도우 프로세스를 지정하여 비활성 매크로를 만드는 것이 아닌,

유동적으로 프로세스를 선택하여 다중 프로세스를 컨트롤 할 수 있는 비활성 매크로를 만들기 위해

현재 실행중인 윈도우 프로세스 정보를 취득하는 과정을 배워보려고합니다. 

 

 

 

앞서, 미리 말씀드리는 부분...

※ 특정 윈도우 창에서는 Window Spy 의 Focused 란의 ClassNN 값을 이용해야지만 작동되는 창이 있을 수 있고,
일반적인 비활성 매크로가 작동하지 않는 ( 소프트웨어식 입력을 제한한 특정 윈도우 프로그램 ) 창이 있을 수 있으니 참고 부탁드립니다. 

 

 

 

현재 활성된 창의 프로세스를 가져오기 위해 사용될 명령어

 

 

WinGet, OutputVar , SubCommand, WinTitle, WinText, ExcludeTitle, ExcludeText
WingetTitle, title, ahk_id %vartemp%

 

Winget : 윈도우의 다양한 속성과 정보를 가져오는 데 사용됩니다.

이 명령어를 사용하여 윈도우의 상태나 속성에 대한 정보를 수집할 수 있습니다.

 

WingetTitle : 특정 윈도우의 제목을 가져오는 데 사용됩니다.

 

 

 

 

 

 

소스코드 및 설명

 

#notrayicon  
#SingleInstance off  

winget,var,list
list_a := ""  
Loop,%var% {
    vartemp := var%A_Index%
    WingetTitle, title, ahk_id %vartemp%
    if (title != ""){
        count++                      
        id%count% := vartemp           
        list_a .= title "`n"
    }
}

msgbox,% list

 

 

 

한 줄씩 설명하자면,

 

#notrayicon   

  • 트레이드 아이콘을 표시하지 않습니다.

#SingleInstance off  

  • 이 프로그램을 여러개 킬 수 있습니다.

winget,var,list 

  • var: 결과를 저장할 변수입니다. var에 현재 열려 있는 모든 윈도우의 핸들이 저장됩니다.
  • List: Winget의 서브커맨드 중 하나로, 모든 열린 윈도우의 핸들을 리스트 형태로 가져옵니다.

 

list_a

  • 서브루틴시, list_a 의 변수를 초기화 시킵니다
    ( 리스트 항목이 들어갈 변수 )

Loop,%var% { }

  • 주어진 변수(var)의 목록만큼 반복합니다.

vartemp := var%A_Index%

  • 윈도우 id를 가져옵니다. 이는 var1 ...var2...var3...var4... 로 인식됩니다

WingetTitle, title, ahk_id %vartemp%

  • ahk_id 값으로 윈도우 id를 (var1...var2... 대입시켜서 타이틀 제목을 가져오고 title 변수에 저장합니다.

if (title != ""){
     count++                     
     id%count% := vartemp           
     list_a .= title "`n"
}

  • if(title != "") { }  : title 변수가 빈 데이터가 아니라면 = 데이터가 있어야지만 괄호 안에있는 코드를 이행합니다.
  • id%count% : id1 ... id2... 에 윈도우 id를 저장합니다
  • list_a .= title 변수를 줄바꿈형식으로 저장합니다.

 

 

 

 

 

 

 

 

다음으로 넘어가기 전

 

현재는 list 변수에 "`n" 줄바꿈 을 통해 나열을 했지만 이 항목들을 dropdownlist ( DDL ) 을 사용하여 격납해야하므로

if(count = 1){
	  list_a .= title "||"
}else{
	  list_a .= title "|"
}
////////////

if (StrLen(list) > 0)
    list := SubStr(list, 1, -1)

 

list_a .= (count = 1) ? title "||" : title "|"
///////////


if (StrLen(list) > 0)
    list := SubStr(list, 1, -1)

 

를 해서 ddl에 맞게 변환을 해주어야합니다

 

if (StrLen(list) > 0)
    list := SubStr(list, 1, -1)

 

 

위 코드는 Loop문이 끝나고 나서 추가해줘야합니다. 이는

마지막 | 문자를 삭제하는 코드입니다.

 

 

 

 

 

 

마치며

 

특정 윈도우창을 핸들링하기 위해, 각 프로세스의 정보를 취득하고 -> 타이틀을 받아오는 과정을

알아 보았습니다. 

 

이렇게 짜놓은 코드를 통해, 다음은 사용자 인터페이스 smartGui를 통해 쉽게 조작할 수있도록 구이를 

만드는 과정을 배워볼 것입니다. 

 

감사합니다.

반응형

+ Recent posts