오토핫키 AutoHotKey 특정 상황에서 명령 예외 처리하기 If 지시어

AutoHotKey는 자동화 및 단축키 설정을 위한 무료 오픈 소스 스크립팅 언어이며 이를 사용하면 키보드 및 마우스 조작, 창 관리, 텍스트 대치 등 다양한 작업을 자동화할 수 있어 필자가 Windows에서 가장 애용하는 프로그램 중 하나인데요.

이렇게 자주 사용하다 보면 단축키가 많아지게 되고 이로 인해 프로그램이 예상치 못한 오류나 스크립트 간의 충돌이 발생하는 경우가 있는데, 이때 시간이나 특정 프로세스의 상태에 따라 키보드 단축키를 사용할 수 있게 하거나, 창이 활성화되어 있는 경우에만 동작하도록 하면 이런 문제를 크게 개선할 수 있습니다.

AutoHotKey에서는 이런 상황을 방지하기 위해 조건문, 상태 변수, 프로그램 활성화 여부 등과 함께 IfWinExist, IfWinActive, WinMinimize 그리고 ifWinActive와 같은 함수를 활용하면 어렵지 않게 특정 조건에서만 발동되는 스크립트를 작성할 수 있습니다. 이처럼 특정 조건 상태에서만 스크립트가 동작하거나 동작하지 않도록 하고 싶다면 다음의 설명을 확인합니다.

아래 설명은 comeinsidebox.com 에서 테스트 및 검증 후 작성 된 내용이지만 이것이 본문의 내용의 정확성이나 신뢰성에 대해 보증을 하는 것은 아니니 단순 하게 참고용으로 확인바랍니다.

튜토리얼 환경: 윈도우 11 Pro (빌드: 22621.1702), AutoHotKey 1.0

선행 사항

본문의 설명을 따라가기 위해서는 기본적으로 AutoHotKey를 설치하고 AutoHotKey의 버전에 대한 이해가 필요합니다.

Auto Hot Key 오토핫키에서 마우스 클릭 이동 드래그 하는 방법

AutoHotKey 설치

오토핫키-다운로드-페이지
오토핫키 다운로드 페이지

AutoHotKey를 이용해 다음에 안내하는 명령을 사용하기 위해서는 사용 중인 컴퓨터에 AutoHotKey가 설치되어 있어야 합니다. AutoHotKey를 설치하는 방법은 AutoHotKey 설치 과정을 안내한 글을 참고합니다.

AutoHotKey 버전에 대한 이해

본문에 사용되는 명령은 주로 AutoHotKey 1.X 버전에 대한 설명이지만 대부분의 명령은 AutoHotKey 2.0에서 유사하게 사용할 수 있습니다. 하지만 그렇지 않은 경우도 있습니다.

몇 가지 예를 들면,WinActive()와 같은 함수를 2.0 버전에서 사용하려면 WinGetActive()로 사용해야 합니다.

그리고 If 문의 구문도 다음과 같이 약간 변경되었습니다.

AutoHotkey 1.x

if A_Hour >= 15 && A_Hour <= 18
{
    ; 오후 3시부터 6시 사이에 수행할 코드
}

AutoHotkey 2.0

if (A_Hour >= 15) && (A_Hour <= 18)
{
    ; 오후 3시부터 6시 사이에 수행할 코드
}

참고:

윈도우10 시스템 시작 프로그램 등록 오토핫키 스크립트 실행 방법 두가지

조건문 활용

조건문은 프로그래밍에서 특정 조건에 따라 프로그램의 실행 흐름을 제어하는 데 사용됩니다. AutoHotKey에서도 if 문을 사용하여 조건 상태를 설정하고 원하는 동작을 수행할 수 있습니다. if 문의 기본 구조와 예제를 통해 조건문의 작성 방법을 자세히 설명해드리겠습니다.

기본 구문

if 문의 기본 구조는 다음과 같습니다.

if (조건식)
{
    // 조건이 참일 때 실행되는 코드
}
else if (다른 조건식)
{
    // 다른 조건이 참일 때 실행되는 코드
}
else
{
    // 모든 조건이 거짓일 때 실행되는 코드
}

위의 구조에서 조건식은 참 또는 거짓으로 평가될 수 있는 표현식이고, 중괄호({}) 내에 있는 코드는 해당 조건이 참일 때 실행됩니다. else if블록을 사용하여 추가적인 조건을 지정할 수 있으며, else 블록은 모든 조건이 거짓일 때 실행됩니다.

오토핫키 한영키 분리하는 방법과 윈도우11 언어전환 오류 해결하기

사용 예시

간단한 예제를 통해 if 문의 작성 방법을 이해해보겠습니다.

x := 15

if (x > 10)
{
    MsgBox, x는 10보다 큽니다.
}

위 예제는 변수 x의 값이 10보다 큰 경우 x는 10보다 큽니다.라는 메시지를 출력하는 스크립트입니다.

y := 50

if (y > 0 && y < 100)
{
    ; y가 0보다 크고 100보다 작을 때 실행되는 코드
}

여러 개의 조건을 동시에 검사해야 하는 경우에는 논리 연산자를 사용할 수 있습니다. 예를 들어, 변수 y의 값이 0보다 크고 100보다 작은 경우에만 특정 동작을 수행하는 스크립트는 다음과 같이 작성할 수 있습니다:

y := 50

if (y > 0 && y < 100)
{
    ; y가 0보다 크고 100보다 작을 때 실행되는 코드
}

이 예제에서 &&는 논리적 AND 연산자로, y > 0y < 100 모두 참이어야 전체 조건이 참이 됩니다.

if 문을 활용하여 조건 상태에 따라 스크립트의 동작을 제어할 수 있습니다. 원하는 조건식을 작성하고, 해당 조건이 참일 때 실행되는 코드를 if 문 내에 작성하면 됩니다. 이를 통해 AutoHotKey 스크립트를 조건에 맞게 유연하게 동작하도록 제어할 수 있습니다.

프로그램 상황에 맞는 동작 설정

AutoHotKey에서 제공하는 윈도우 관련 함수인 IfWinExist, IfWinActive, WinMinimize 등을 사용하면 특정 프로그램이 실행 중인지 확인하고, 이를 기반으로 동작을 설정할 수 있습니다. 전술한 조건문과 유사한 방식이라고 볼 수 있으며 같이 사용하면 시너지가 있습니다.

Auto Hot Key 오토핫키에서 마우스 클릭 이동 드래그 하는 방법

창을 인식하는 옵션들

IfWinExistIfWinActive 함수를 사용하기 위해서는 대상 윈도우 창이 존재하는 지를 일단 인식 시킬 필요가 있는데, 이때 사용할 수 있는 다양한 옵션들을 정리해드리겠습니다. 아래는 주로 사용되는 옵션들입니다.

참고: AutoHotkey에서 함께 제공되는 유틸리티 도구인 Window Spy를 사용하면 현재 사용자가 마우스 커서를 올려놓은 창에 대한 정보를 실시간으로 표시하여, 해당 창의 제목, 클래스, 크기, 위치, 스크린 좌표 등과 같은 정보를 확인할 수 있게 해주기 때문에 아래의 정보들을 확인할 때 유용하게 사용할 수 있습니다. 자세한 내용은 AutoHotKey에서 Window Spy를 사용하는 방법을 확인하세요.

윈도우 클래스 이름

IfWinExist, ahk_class Notepad
{
    ; Notepad 클래스 이름을 가진 윈도우가 존재할 때 실행되는 코드
}

윈도우 클래스 이름은 윈도우를 식별하는 데 사용되는 고유한 식별자입니다. 클래스 이름은 윈도우가 속하는 응용 프로그램이나 윈도우의 유형에 따라 다릅니다.

윈도우 제목과 클래스 이름 조합

IfWinExist, ahk_exe explorer.exe, FolderView
{
    ; "explorer.exe" 프로세스에서 "FolderView" 클래스 이름을 가진 윈도우가 존재할 때 실행되는 코드
}

윈도우 제목과 클래스 이름을 조합하여 더 구체적인 윈도우 식별을 할 수 있습니다.

프로세스 이름

IfWinExist, ahk_exe explorer.exe, FolderView
{
    ; "explorer.exe" 프로세스에서 "FolderView" 클래스 이름을 가진 윈도우가 존재할 때 실행되는 코드
}

ahk_exe 접두사를 사용하여 실행 중인 프로세스의 실행 파일명으로 윈도우를 확인할 수 있습니다.

윈도우 핸들

IfWinExist, ahk_exe notepad.exe
{
    ; "notepad.exe" 프로세스에서 실행 중인 윈도우가 존재할 때 실행되는 코드
}

윈도우 핸들은 고유한 숫자 값으로 윈도우를 식별하는 데 사용됩니다. WinExist 함수를 사용하여 윈도우 핸들을 얻고, 해당 핸들을 사용하여 윈도우를 확인할 수 있습니다.

IfWinExist 함수

IfWinExist 함수는 특정 윈도우 창이 존재하는지 확인하는데 사용됩니다.

IfWinExist, [대상 윈도우]
{
    ; 윈도우 창이 존재할 때 실행되는 코드
}

IfWinExist 함수의 기본 구조는 위와 같은 형태입니다.

  • 위의 코드에서 [대상 윈도우]는 확인하려는 윈도우 창의 제목을 나타내는 옵션입니다. 창을 인식하는 옵션들 단락에서 안내한 옵션 중 하나를 사용하면 됩니다.
  • IfWinExist 함수는 윈도우 창이 존재하면 해당 창의 유무를 확인하고, 조건이 참이면 중괄호({}) 내의 코드를 실행합니다.
IfWinExist, Notepad
{
    MsgBox, Notepad 창이 존재합니다.
}

위 예제는 Notepad라는 창이 존재하는지 확인하고, 창이 존재하면 메시지를 출력하는 스크립트입니다:

Auto Hot Key 오토핫키에서 마우스 클릭 이동 드래그 하는 방법

IfWinActive 함수

IfWinActive 함수는 특정 윈도우 창이 활성화되어 있는지 확인하는데 사용됩니다.

IfWinActive, [대상 윈도우]
{
    ; 윈도우 창이 활성화되어 있을 때 실행되는 코드
}

IfWinActive 함수의 기본 구조는 위와 같습니다.

  • [대상 윈도우]는 확인하려는 윈도우 창의 제목을 나타내는 문자열입니다. 창을 인식하는 옵션들 단락에서 안내한 옵션 중 하나를 사용하면 됩니다.
  • IfWinActive 함수는 윈도우 창이 활성화되어 있으면 조건이 참이 되고, 중괄호({}) 내의 코드를 실행합니다.

통합 예시

위 함수들을 조합해서 사용되는 몇 가지 예시를 안내합니다.

SetTitleMatchMode, 2

; 특정 프로그램이 실행 중인지 확인
IfWinExist, Calculator
{
    ; Calculator 프로그램이 실행 중일 때 실행되는 코드
    MsgBox, Calculator가 실행 중입니다.
}

; 특정 프로그램이 활성화되어 있는지 확인
IfWinActive, Notepad
{
    ; Notepad 프로그램이 활성화되어 있을 때 실행되는 코드
    MsgBox, Notepad가 활성화되어 있습니다.
}

; 특정 프로그램이 활성화되면 최소화
#IfWinActive, Chrome
WinMinimize, Chrome

위의 예제 코드에서는 세 가지 상황에 맞게 동작을 설정하고 있습니다.

  • IfWinExist를 사용하여 Calculator라는 타이틀을 가진 윈도우(프로그램)이 실행 중인지 확인합니다. 실행 중일 경우 Calculator가 실행 중입니다.라는 메시지를 표시합니다.
  • IfWinActive를 사용하여 Notepad라는 타이틀을 가진 윈도우(프로그램)가 활성화되어 있는지 확인합니다. 활성화되어 있을 경우 Notepad가 활성화되어 있습니다.라는 메시지를 표시합니다.
  • #IfWinActive를 사용하여 Chrome이라는 타이틀을 가진 윈도우(프로그램)가 활성화되면 WinMinimize 함수를 사용하여 Chrome 윈도우를 최소화합니다. 이는 Chrome이 활성화되었을 때 자동으로 최소화되도록 동작을 설정한 예시입니다.
#!c::
IfWinExist, ahk_exe chrome.exe
{
    ifWinActive, ahk_exe chrome.exe
    { 
        WinMinimize, ahk_exe chrome.exe
    }
    else
    {
        WinActivate ahk_exe chrome.exe
    }
}
else
{
    Run C:\Program Files\Google\Chrome\Application\chrome.exe
}
return

해당 코드는 #!c에 의해 Win + Alt + C 단축키를 누를 때 동작하며 Chrome이 실행 중이면 활성화 여부에 따라 최소화 또는 활성화가 이루어지고, Chrome이 실행 중이지 않으면 Chrome을 실행합니다. 필자가 실제 사용하는 방식이며, 자세한 내용은 다음과 같습니다.

  • IfWinExist 함수를 사용하여 Chrome 프로그램이 실행 중인지 확인합니다. 실행 중인 경우 중괄호 내의 코드를 실행합니다. 실행 중이 아닌 경우 else 블록으로 이동합니다.
  • ifWinActive 함수를 사용하여 Chrome 프로그램이 활성화되어 있는지 확인합니다. 활성화되어 있으면 WinMinimize 함수를 사용하여 Chrome 창을 최소화합니다.
  • 활성화되어 있지 않은 경우 else 블록으로 이동하여 WinActivate 함수를 사용하여 Chrome 창을 활성화합니다.
  • 만약 Chrome 프로그램이 실행 중이지 않은 경우, else 블록으로 이동하여 Run 명령을 사용하여 Chrome 프로그램을 실행합니다.
  • return 문으로 스크립트의 실행을 종료합니다.
오토핫키 한영키 분리하는 방법과 윈도우11 언어전환 오류 해결하기

상태 변수 활용

AutoHotKey에서 상태 변수를 사용하여 동작 조건을 설정할 수 있습니다. 상태 변수란, 스크립트의 동작 상태를 기억하기 위한 변수입니다. 이 변수는 스크립트 실행 중 특정 조건이 충족될 때 변경되고, 변경된 값에 따라 스크립트의 동작을 제어하는데 사용됩니다. 상태 변수를 잘 활용하면 동일한 스크립트에서 여러 상황에 대응할 수 있는 유연한 코드를 작성할 수 있습니다.

; 상태 변수 초기화
MyState := 0

; 특정 조건에 따른 동작 제어
If (MyState = 0)
{
    ; MyState 값이 0일 때 실행되는 코드
    MsgBox, 상태 변수가 0입니다.
}
Else If (MyState = 1)
{
    ; MyState 값이 1일 때 실행되는 코드
    MsgBox, 상태 변수가 1입니다.
}
Else
{
    ; MyState 값이 0 또는 1이 아닐 때 실행되는 코드
    MsgBox, 상태 변수가 다른 값입니다.
}

위 구문은 상태 변수를 활용한 예제입니다.

  • MyState라는 상태 변수를 초기값 0으로 설정하고, 조건문을 사용하여 변수의 값에 따라 다른 동작을 수행합니다.
  • 상태 변수 MyState의 값이 0이면 첫 번째 조건문이 실행되고, 값이 1이면 두 번째 조건문이 실행됩니다. 값이 0 또는 1이 아닌 경우에는 세 번째 조건문이 실행됩니다.
; 상태 변수 초기화
MyState := 0

; 이벤트 발생 시 상태 변수 변경
F1::
    MyState := 1
    return

F2::
    MyState := 2
    return

; 상태 변수에 따른 동작 제어
If (MyState = 1)
{
    ; MyState 값이 1일 때 실행되는 코드
    MsgBox, F1 키 이벤트 발생 - 상태 변수가 1로 변경되었습니다.
}
Else If (MyState = 2)
{
    ; MyState 값이 2일 때 실행되는 코드
    MsgBox, F2 키 이벤트 발생 - 상태 변수가 2로 변경되었습니다.
}

상태 변수를 변경하여 조건부 동작을 제어할 수 있습니다. 예를 들어 위와 같이 사용 시 특정 이벤트가 발생하면 상태 변수의 값을 변경하여 다른 동작을 수행하도록 할 수 있습니다.

; 상태 변수 초기화
MyState := 0

; 이벤트 발생 시 상태 변수 변경
F1::
    MyState := 1
    return

F2::
    MyState := 2
    return

; 상태 변수에 따른 동작 제어
If (MyState = 1)
{
    ; MyState 값이 1일 때 실행되는 코드
    MsgBox, F1 키 이벤트 발생 - 상태 변수가 1로 변경되었습니다.
}
Else If (MyState = 2)
{
    ; MyState 값이 2일 때 실행되는 코드
    MsgBox, F2 키 이벤트 발생 - 상태 변수가 2로 변경되었습니다.
}

한 가지 더 예시를 들어보면, F1 키와 F2 키 이벤트가 발생하면 MyState 변수의 값을 각각 12로 변경합니다. 그리고 상태 변수의 값에 따라 다른 동작을 수행합니다. 이를 통해 상태 변수의 변경으로 원하는 동작을 조건부로 수행할 수 있습니다.

시간 기반 조건 설정

AutoHotKey를 사용하여 스크립트가 특정 시간에만 동작하도록 조건을 설정할 수 있습니다. 이 방식으로 스케줄링 작업이나 시간대별 작업을 구현할 수 있습니다.

; 현재 시간 정보 얻기
CurrentHour := A_Hour
CurrentMin := A_Min
CurrentSec := A_Sec

; 특정 시간 범위 내에서만 동작 설정
if (CurrentHour >= 9 && CurrentHour <= 17) ; 9시부터 17시까지
{
    MsgBox, 현재는 업무 시간입니다.
    ; 추가로 원하는 동작을 설정할 수 있습니다.
}

현재 시간 정보를 얻기 위해 A_Hour, A_Min, A_Sec 변수를 사용합니다.

  • 이후 조건문을 사용하여 현재 시간이 9시부터 17시 사이인 경우 "현재는 업무 시간입니다."라는 메시지를 표시하는 메시지 박스가 나타납니다.
  • 원하는 동작을 추가로 설정하고 싶다면 해당 블록 내에서 추가 코드를 작성하면 됩니다.
Obsidian 옵시디언 코어 플러그인과 커뮤니티 플러그인 사용하기

마치며

AutoHotKey를 사용할 때 특정 상황에서만 명령을 예외 처리하는 다양한 방법들에 대해 알아보았습니다. 위 방식을 사용하면 특정 조건이 충족되는 경우에만 스크립트가 동작하도록 설정할 수 있습니다. 이는 사용자가 원하는 방식으로 동작을 제어하고 조건에 맞게 스크립트를 사용할 수 있게 해줍니다.

다만, 상황에 따라 동작을 제어하는 방법은 스크립트의 복잡성을 증가시킬 수 있습니다. 조건문과 변수를 적절하게 사용해야 하며, 잘못된 조건 설정이나 변수 처리 오류가 발생할 수 있습니다. 또한 다양한 상황에 따라 동작이 예외 처리되는 스크립트는 유지 보수가 어려울 수 있습니다. 특히 조건문이나 변수 처리를 수정해야 할 때 예기치 않은 동작이 발생할 수 있으므로 주의가 필요합니다.

그럼에도 특정 상황에 따라 스크립트가 자동으로 동작하도록 설정하면 작업을 자동화하고 반복적인 작업을 줄일 수 있습니다. 이는 작업의 효율성을 높이고 생산성을 향상시킬 수 있으니 위의 내용을 참고하여 AutoHotKey를 다양한 상황에서 사용해 보시길 바랍니다.

관련 글

댓글로 남기기 어려운 내용은 Contact Form 에서 개별적으로 문의 할 수 있습니다. 해당 글과 연관 된 내용은 Copy를 이용해 현재 페이지의 주소를 복사 후 문의 폼에 입력시 보다 정확한 답을 얻을 수 있습니다.

Leave a Comment