AutoHotKey(오토핫키) 설명서 Example

Posted by 발전소장
2014. 8. 13. 15:35 AutoHotKey

사용예

여기에서는,AutoHotkey그리고 실현될 수 있는 기능의 일례를 소개한다.

덧붙여 예의 안으로 자동 조작등의 대상이 되고 있는 프로그램은, 특히 기술이 없는 경우 가공의 물건이다.

키 할당 변경

리맵기능을 이용하면, 특정의 키 조작에 다른 키를 할당할 수 있다.
대체로 모든 키와 mouse button, 죠이스틱의 버튼의 할당이 가능하다.

#h::left    ;Win+H에←키를 할당
#j::down    ;Win+J에↓키를 할당
#k::up      ;Win+K에↑키를 할당
#l::right   ;Win+L에→키를 할당

특정 소프트의 키 바인드 변경

#IfWinActive사령을 사용하면, 특정의 종류의 윈도우에서만 키 할당을 유효하게 할 수 있다.
윈도우의 판별에는 윈도우 타이틀이나 클래스명을 사용할 수 있다.윈도우의 클래스명은, 부속의AU3_Spy.exe그리고 조사할 수 있다.
Run커멘드와Process,WaitClose(을)를 사용하면, 스크립트 기동시에 대상 소프트를 기동해, 대상 소프트가 종료하면 스크립트도 종료한다고 하는 툴도 실현될 수 있다.

Run,notepad.exe                 ;메모장을 하나 기동
Process,WaitClose,notepad.exe   ;메모장이 모두 종료할 때까지 대기
ExitApp                         ;스크립트를 종료한다

#IfWinActive ahk_class Notepad  ;메모장의 윈도우가 액티브때만 할당을 실시하게 한다
^r::^h                          ;Ctrl+R에Ctrl+H(치환)(을)를 할당
#IfWinActive                    ;윈도우의 한정을 해제

복잡한 조작을1키에 할당

hot key에Send커멘드를 할당하는 것으로, 복잡한 조작을1키로 끝마칠 수 있게 된다.
표준적인GUI어플리케이션이라면,Alt+T키로 「툴(T)」(와)과 같은 액세스 키를 할당할 수 있었던 메뉴 항목을 조작하거나Tab키로 입력란의 사이를 포커스 이동하는 등, 키의 송신만으로도 대부분의 조작을 실시할 수 있게 되어 있다.
덧붙여 메뉴의 선택이나 입력란에의 입력에 대해서는,컨트롤 조작계 커멘드그리고 직접 조작하는 일도 가능.이 쪽이 고속이고 확실히 동작하지만, 스크립트를 작성하는 것이 다소 귀찮게 된다.

#IfWinActive ahk_class Notepad  ;메모장의 윈도우가 액티브때만 할당을 실시하게 한다
^w::Send,!ow                    ;Alt+O그리고 「서식」메뉴를 표시해, 「W」키로 「우단에서 되풀이해」를 선택
#IfWinActive                    ;윈도우의 한정을 해제

백그라운드의 소프트를 조작

비액티브의 윈도우나 비표시의 윈도우에 키 조작을 보내는 기능을 이용하면, 사운드 플레이어나 상주 소프트등을 좋아하는 hot key로 직접 조작할 수 있게 된다.

#n::                                        ;Win+n에 할당
DetectHiddenWindows,On                      ;비표시의 윈도우를 대상으로 포함하도록(듯이) 한다
ControlSend,,^n,ahk_class SomeApplication   ;대상 윈도우에Ctrl+N키를 송신
return                                      ;hot key 써브루틴을 종료

프로그램 발사장치

Run커멘드로 프로그램을 기동하는 것으로, 발사장치를 실현할 수 있다.
단지 hot key에 할당하면, 홋트키란체로서 이용할 수 있다.

#1::Run,notepad.exe        ;Win+1에 메모장의 기동을 할당
#2::Run,iexplore.exe       ;Win+2에IE의 기동을 할당

이미 기동하고 있는 경우는, 그 프로세스를 액티브하게 한다

프로세스가 기동하고 있을지를 조사하는 기능이나, 특정 프로세스의 윈도우를 조작하는 기능을 사용하면, 이미 기동하고 있는 프로세스를 액티브화할 수 있다.
복수 프로세스를 실행할 필요가 없는데 중복 기동 방지 기능이 없는 소프트등을 사용하기 쉽게 할 수 있다.

Process,Exist,notepad.exe               ;메모장이 기동하고 있을지를 조사한다
If ErrorLevel<>0                        ;기동하고 있었을 경우(ErrorLevel변수에 프로세스ID하지만 격납된다)
    WinActivate,ahk_pid %ErrorLevel%    ;그 프로세스의 윈도우를 액티브하게 한다
else                                    ;기동하지 않았던 경우
    Run,notepad.exe                     ;메모장을 기동한다

프로그램을 상대 패스로 지정

실행하는 파일은 상대 패스로 지정할 수도 있다.
리모트 미디어내의 프로그램을 기동하는 란체를 만들고 싶을 때 등에 유효.

이하의 스크립트는, 실행하면 메뉴로 프로그램을 일람표 나타내 보여, 선택한 프로그램을 기동한다.
상주시켜 사용하고 싶은 경우에는, hot key 등에 「Menu,M1,Show」의 부분을 할당하면 좋다.

SetWorkingDir,%A_ScriptDir%                     ;상대 패스의 기준 폴더를 스크립트가 있는 폴더로 설정
Menu,M1,Add,.\apps\notepad\notepad.exe,Launch   ;메뉴에 파일을 추가(이와 같이 몇행인가 쓴다)
Menu,M1,Show                                    ;메뉴를 표시
return                                          ;종료

Launch:                                         ;메뉴가 선택되었을 때에 여기에서 앞이 실행된다
Run,%A_ThisMenuItem%                            ;선택된 메뉴명을 커멘드 라인으로서 실행
return                                          ;써브루틴의 종료

환경 변수를 지정해 프로그램을 기동

스크립트중으로부터 환경 변수를 변경해 프로그램을 기동할 수 있다.
시스템의 환경 변수 설정을 변경하지 않고 , 설정에 환경 변수를 사용하는 프로그램을 이용하고 싶은 경우 등에 도움이 된다.
Windows의BAT파일에서도 동등이 할 수 있지만, 「A_ScriptDir」등의 편입 변수 덕분에 기술이 편해지고 있다.

EnvSet,USERPROFILE,%A_ScriptDir%\data   ;설정의 보존처가 된다USERPROFILE의 패스를 변경
Run,%A_ScriptDir%\bin\someapp.exe       ;프로그램을 기동

자동 조작

윈도우 상태를 판별하는 기능등을 이용하면, 프로그램이 처리를 끝내는 것을 기다리고 나서 계속을 실행할 수도 있다.

Run,app01.exe                   ;첫째의 프로그램을 기동
WinWait,ahk_class app01wnd      ;프로그램의 윈도우가 표시될 때까지 대기
ControlSend,,{Tab}{Enter}       ;그 윈도우에 처리를 개시시키기 위한 키 조작을 송신
WinWait,완료                    ;처리 완료의 메세지가 나올 때까지 대기
WinClose                        ;그 윈도우를 닫는다
WinClose,ahk_class app01wnd     ;프로그램의 윈도우를 닫는다
Run,app02.exe                   ;2손톱의 프로그램을 기동
;이하, 똑같이 작업을 기술해 나간다

폴더내의 파일을 모두 처리

파일Loop(을)를 사용하면, 폴더내의 파일 모두에 대해서 반복해 같은 처리를 실시할 수 있다.
자동 조작 기능과 조합하는 것으로,GUI어플리케이션으로의 정형 작업을 효율화할 수 있다.
처리의 도중에 파일의 삭제등의 처리를 실시하고 싶은 경우, 각종의파일 관련 커멘드하지만 이용할 수 있다.

Loop,D:\files\*.jpeg                    ;지정 폴더내의 모든JPEG파일에 대해 처리
{                                       ;반복 블록의 시작
    Run,app.exe "%A_LoopFileLongPath%"  ;대상 파일을 인수로서 프로그램을 기동
    WinWait,ahk_class appwnd            ;윈도우가 표시될 때까지 대기
    ControlClick,Button1                ;그 윈도우의 버튼을 클릭한다
    Loop{                               ;처리가 끝날 때까지 반복
        ControlGet,e,Enabled,,Button1   ;버튼이 사용 금지로 되어 있지 않은가를 취득
        If e=1                          ;사용 금지가 아니면, 처리 종료로 간주한다
            break                       ;반복을 종료한다
    }
    WinClose                            ;윈도우를 닫는다
    FileDelete,%A_LoopFileLongPath%     ;대상 파일을 삭제
}

화면상의 영상을 판별한 자동 조작

화면상으로부터 특정의 화상에 일치하는 부분이나, 지정의 색이 되어 있는 부분을 검색하는 기능을 이용하면, 통상의 방법에서는 판별할 수 없는 상태도 판별할 수 있는 경우가 있다.
게임등의 자동화에 이용할 수 있을 가능성이 있지만, 입출력의 실현 방식이 특수하기 때문에AutoHotkey그럼 조작할 수 없는 소프트도 적지 않다.

Numpad0::                                   ;숫자 패드의 「0」키에 할당한다
Send,{F1}{Enter}                            ;개시 조작을 실행
Loop{                                       ;조건을 채울 때까지 반복
    PixelSearch,,,0,0,100,100,0x0000FF,,RGB ;윈도우 좌상100*100피크셀의 범위에 청색의 부분이 있을지를 판별
    if ErrorLevel=0                         ;청색의 부분이 발견되면
        break                               ;반복을 빠진다
}
Send,{Esc}{Esc}                             종료 조작을 실행
return                                      ;hot key 써브루틴을 종료

클립보드 경유로 문자열을 주고받아

Clipboard변수를 이용하면, 간단하게 클립보드내의 문자열 데이터를 조작할 수 있다.
Send커멘드와 조합하면, 브라우저나 에디터등에서 선택된 문자열을 취득하거나 caret 위치에 문자열을 삽입하거나 하는 일도 간단하게 할 수 있다.

#g::                                            ;Win+G키에 할당
bk=%ClipboardAll%                               ;클립보드의 내용을 백업
Clipboard=                                      ;클립보드를 클리어
Send,^c                                         ;Ctrl+C키를 송신
ClipWait                                        ;클립보드에 텍스트가 격납될 때까지 대기
Run,http://www.google.com/search?q=%Clipboard%  ;클립보드의 내용을 검색한다Google의URL(을)를 연다
Clipboard=%bk%                                  ;백업 한 내용을 써 반환
return

클립보드의 감시

OnClipboardChange라벨을 기술하는 것으로, 클립보드의 내용이 변경되었을 때에 특정의 처리를 하도록(듯이) 할 수 있다.

#Persistent                         ;hot key등을 사용하지 않는 경우로, 스크립트를 상주시키고 싶을 때에 기술
OnClipboardChange:                  ;클립보드의 내용이 변경되었을 때에 실행되는 라벨
StringLeft,l,Clipboard,7            ;문자열의 선두7문자를 잘라
StringRight,r,Clipboard,4           ;문자열의 말미4문자를 잘라
if l=http://                        ;선두가 「http://」(으)로
    if r in jpeg,.jpg               ;말미가 「jpeg」 「.jpg」의 어느 쪽일까들
        Run,app.exe %Clipboard%     ;그URL(을)를 인수에 프로그램을 기동
return                              ;써브루틴을 종료

정기 실행

타이머 기능을 이용하는 것으로, 정기적으로 특정의 처리를 실행 당한다.
단지 특정의 동작을 정기 실행하거나 윈도우나 프로세스등의 상태를 감시해 처리를 실행하거나라고 했던 것에 이용할 수 있다.

#Persistent                         ;hot key등을 사용하지 않는 경우로, 스크립트를 상주시키고 싶을 때에 기술
SetTimer,OnTimer,1000               ;지정 써브루틴을1초 마다 실행되도록(듯이) 한다
return                              ;스크립트 기동시에 실행되는 부분의 종료

OnTimer:                            ;타이머에 할당할 수 있는 써브루틴 라벨
Process,Exist,app.exe               ;지정 프로그램이 실행되고 있는지를 검출
If ErrorLevel=0                     ;실행되어 있지 않은 경우
    Run,app.exe                     ;재기동한다
return                              ;타이머 써브루틴의 종료

지정 시각에 실행

편입 변수를 사용하면 현재 시각등의 정보도 이용할 수 있다.
1초 마다 써브루틴을 실행해, 지정 시각을 지나고 있으면 처리를 실행한다라고 하는 일도 가능하다.

#Persistent                         ;hot key등을 사용하지 않는 경우로, 스크립트를 상주시키고 싶을 때에 기술
time=%A_Now%                        ;현재 시각을 취득
EnvAdd,time,30,Minutes              ;시각에30분 가산
SetTimer,OnTimer,500                ;지정 써브루틴을0.5초 마다 실행되도록(듯이) 한다
return                              ;스크립트 기동시에 실행되는 부분의 종료

OnTimer:                            ;타이머에 할당할 수 있는 써브루틴 라벨
If A_Now>%time%                     ;현재 시각이 지정 시각을 지나면
    MsgBox,30분 경과                 ;메세지를 표시
ExitApp                             ;스크립트를 종료

아무것도 조작을 하고 있지 않을 때에 실행

A_TimeIdlePhysical변수를 사용하는 것으로, 유저가 마지막에 어떠한 조작을 실시하고 나서 경과한 시간을 취득할 수 있다.
유저가 조작을 실시하지 않을 때를 가늠하고 처리를 실시하는 등의 기능을 실현될 수 있다.

#Persistent                         ;hot key등을 사용하지 않는 경우로, 스크립트를 상주시키고 싶을 때에 기술
SetTimer,OnTimer,1000               ;지정 써브루틴을1초 마다 실행되도록(듯이) 한다
return                              ;스크립트 기동시에 실행되는 부분의 종료

OnTimer:                            ;타이머에 할당할 수 있는 써브루틴 라벨
If A_TimeIdlePhysical>60000         ;1분 이상 조작을 실시하지 않으면
{
    if flag<>1                      ;실행되었는지의 플래그가 서있지 않으면
    {
        Run,app.exe                 ;프로그램을 실행
        flag=1                      ;플래그를 세운다
    }
}else{                              ;최근1분 이내에 조작을 했을 경우
    flag=0                          ;플래그를 해제한다
}
return                              ;타이머 써브루틴의 종료

Windows의 슛다운시에 처리를 실행

OnExit커멘드로 스크립트가 종료될 때 실행되는 처리를 설정할 수 있다.
A_ExitReason변수로 종료 이유를 판별하면,Windows하지만 슛다운 되려고 하고 있을 때 특정의 처리를 실행 당한다.

#Persistent                         ;hot key등을 사용하지 않는 경우로, 스크립트를 상주시키고 싶을 때에 기술
OnExit,WatchShutDown                ;종료시에 실행되는 써브루틴을 할당
return                              ;스크립트 기동시의 처리를 종료

WatchShutDown:                      ;종료시에 실행되는 써브루틴 라벨
if A_ExitReason=ShutDown            ;종료 이유가Windows의 슛다운인지 어떤지를 판별
    RunWait,app.exe                 ;프로그램을 실행해, 종료까지 대기
ExitApp                             ;스크립트를 종료시킨다

음량의 제어

사운드를 재생하거나 음량의 설정을 변경하거나 하는 기능도 있다.
아래와 같은 예에서는, hot key로 음량을 조절할 때 마다Windows표준의 통지음을 재생하고 있다.

#up::
SoundSet,+10
SoundPlay,*64
return

#down::
SoundSet,-10
SoundPlay,*64
return

어플리케이션의GUI프론트엔드 작성

Gui커멘드를 사용하는 것으로, 입력 폼을 간단하게 작성할 수 있다.
복잡한 커멘드 라인 인수를 입력하지 않으면 사용할 수 없는 콘솔 프로그램을GUI(으)로부터 간단하게 사용할 수 있게 된다

Gui,Add,Text,,대상 파일                          ;라벨을 추가
Gui,Add,Edit,x100 yp+0 vTarget w400,                ;입력란을 추가
Gui,Add,CheckBox,x100 vC1 w100,옵션&1         ;체크 박스를 추가
;이와 같이 옵션의 체크 박스를 추가

Gui,Add,Button,gExec x400 yp+0,&OK                  ;실행 버튼을 추가
Gui,Show                                            ;윈도우를 표시
return                                              ;스크립트 기동시의 처리를 종료

Exec:                                               ;실행 버튼에 할당할 수 있는 써브루틴
Gui,Submit,NoHide                                   ;폼의 내용을 변수에 반영
cmd=app.exe "%Target%"                              ;기본이 되는 커멘드 라인을 작성
if C1=1                                             ;체크 박스가ON그렇다면
    cmd=%cmd% /o                                    ;커멘드 라인 옵션을 추가
;이와 같이 체크 박스의 처리를 기술
Run,%cmd%                                           ;커멘드 라인을 실행
return

GuiDropFiles:                                       ;윈도우에 파일이 드롭 되었을 때에 실행된다
StringSplit,fn,A_GuiEvent,`n                        ;파일명의 일람을 한개씩에 분할
GuiControl,,Target,%fn1%                            ;에디트 박스에 첫째의 파일명을 설정
return                                              ;써브루틴을 종료

GUI어플리케이션의 프론트엔드

조작 자동화 기능을 이용하면, 사용 방법이 귀찮고 알기 힘들다GUI프로그램을 간단한 조작으로 이용할 수 있도록 할 수도 있다.

Gui,Add,Button,gB1,처리A(을)를 실행  ;버튼1(을)를 추가
;이와 같이 몇개의 버튼을 추가
Gui,Show                        ;윈도우를 표시
return                          ;스크립트 기동시의 처리를 종료

B1:                             ;버튼1에 할당한 써브루틴 라벨
Run,app.exe                     ;프로그램을 기동
WinWait,ahk_class AppWnd        ;윈도우가 표시될 때까지 대기
ControlSend,,!eg!ef!x{Space}!o  ;까다로운 조작을 송신
ExitApp                         ;스크립트를 종료시킨다

;이와 같이 몇개의 버튼에 대응한 써브루틴을 기술

템플릿으로부터 파일을 작성

Transform커멘드를 사용하는 것으로, 미리 준비한 템플릿 파일에 변수의 내용을 묻을 수 있다.
이것을 이용하면, 입력 폼에 입력된 내용을 바탕으로 처리 설정 파일을 작성해 프로그램을 기동한다고 말한 것도 간단하게 실시할 수 있다.

;GUI작성 부분은 생략.
Gui,Add,Button,gExec x400 yp+0,&OK                  ;실행 버튼을 추가
Gui,Show                                            ;윈도우를 표시
return                                              ;스크립트 기동시의 처리를 종료

Exec:                                               ;실행 버튼에 할당할 수 있는 써브루틴
;폼의 입력 내용을 바탕으로, 템플릿에 묻는 문자열을 생성하는 처리를 기술
FileRead,template,%A_ScriptDir%\template.ini        ;템플릿 파일을 읽어들여
Transform,inifile,Deref,%template%                  ;템플릿내의 변수 참조를 전개
FileDelete,%A_ScriptDir%\setting.ini                ;기존의 파일을 삭제
FileAppend,%inifile%,%A_ScriptDir%\setting.ini      ;내용을 파일에 보존
Run,app.exe "/ini=%A_ScriptDir%\setting.ini         ;프로그램을 기동
return                                              ;써브루틴을 종료

template.ini의 내용은 이하와 같은 요령으로 기술한다.
「%」(으)로 둘러싸 변수명을 기술한 부분이 변수에 격납된 내용에 치환된다.

[General]
TargetFile=%File%
SearchStr=%SearchStr%
IdleTime=%idle%

#이하약어