🔬 과학·테크/🔥 AutoHotkey v2 입문 가이드

AutoHotkey v2 입문 가이드 #6: 프로그램 실행과 창 관리 - Run, WinActivate, WinWait

_eNKI 2025. 12. 9. 19:41
반응형

🎯 이 글에서 배우는 것: Run으로 프로그램 실행, 창 활성화/대기/제어


🚀 Run - 프로그램 실행하기

Run은 프로그램, 파일, 웹사이트를 실행하는 만능 함수입니다.

기본 사용법

Run("notepad")              ; 메모장
Run("calc")                 ; 계산기
Run("mspaint")              ; 그림판
Run("explorer")             ; 파일 탐색기

웹사이트 열기

Run("https://www.google.com")
Run("https://www.youtube.com")
Run("mailto:someone@example.com")  ; 이메일 클라이언트

파일/폴더 열기

Run("C:\Users\홍길동\Documents\report.docx")  ; 파일 열기
Run("C:\Users\홍길동\Downloads")              ; 폴더 열기
Run(A_Desktop)                                 ; 바탕화면 열기

특정 프로그램으로 파일 열기

Run("notepad.exe C:\test.txt")               ; 메모장으로 파일 열기
Run("code C:\Projects\myproject")            ; VS Code로 폴더 열기

🏃 RunWait - 실행 후 대기

프로그램이 종료될 때까지 기다립니다:

RunWait("notepad")         ; 메모장 닫힐 때까지 대기
MsgBox("메모장이 닫혔습니다!")

반환값 받기

프로그램의 종료 코드를 받을 수 있습니다:

exitCode := RunWait("myprogram.exe")
MsgBox("종료 코드: " exitCode)

🔍 창 식별하기

창을 제어하려면 먼저 어떤 창인지 알려줘야 합니다.

창 식별 방법

방식 설명 예제
제목 창 제목 (일부분도 OK) "메모장"
ahk_class 창 클래스 "ahk_class Notepad"
ahk_exe 실행 파일명 "ahk_exe notepad.exe"
ahk_id 창 핸들(HWND) "ahk_id 0x12345"
ahk_pid 프로세스 ID "ahk_pid 1234"

Window Spy로 확인하기

  1. AHK 트레이 아이콘 우클릭Window Spy
  2. 원하는 창 클릭
  3. 정보 확인:
    • Window Title (창 제목)
    • ahk_class (클래스)
    • ahk_exe (실행 파일)

🎯 WinActivate - 창 활성화

창을 앞으로 가져옵니다:

WinActivate("메모장")
WinActivate("ahk_exe notepad.exe")
WinActivate("ahk_class Notepad")

제목 일부분 매칭

SetTitleMatchMode(2)           ; 부분 매칭 모드
WinActivate("Chrome")          ; "Google Chrome - ..." 같은 창 활성화

SetTitleMatchMode 옵션

동작
1 제목이 해당 문자로 시작 (기본값)
2 제목 어디서든 포함
3 정확히 일치
"RegEx" 정규표현식 매칭

⏳ WinWait - 창이 나타날 때까지 대기

창이 열릴 때까지 기다립니다:

Run("notepad")
WinWait("제목 없음 - 메모장")   ; 메모장이 열릴 때까지 대기
MsgBox("메모장이 열렸습니다!")

타임아웃 설정

if WinWait("메모장",, 5) {     ; 5초까지 대기
    MsgBox("창을 찾았습니다!")
} else {
    MsgBox("창을 찾지 못했습니다")
}

WinWaitActive - 활성화될 때까지 대기

Run("notepad")
WinWaitActive("메모장")        ; 메모장이 활성화될 때까지 대기
Send("자동 입력!")

📋 WinExist - 창 존재 확인

창이 있는지 확인합니다:

if WinExist("메모장") {
    MsgBox("메모장이 열려 있습니다")
} else {
    MsgBox("메모장이 없습니다")
}

있으면 활성화, 없으면 실행

#n::{  ; Win+N
    if WinExist("ahk_exe notepad.exe") {
        WinActivate
    } else {
        Run("notepad")
    }
}

🎛️ 창 조작 함수들

WinClose - 창 닫기

WinClose("메모장")
WinClose("ahk_exe notepad.exe")

WinKill - 강제 종료

닫히지 않는 창을 강제로 종료:

WinKill("응답 없음 - 프로그램")

WinMinimize / WinMaximize - 최소화/최대화

WinMinimize("메모장")
WinMaximize("메모장")
WinRestore("메모장")    ; 원래 크기로

WinMove - 창 이동/크기 조절

WinMove(0, 0, 800, 600, "메모장")  ; x, y, width, height
WinMove(100, 100,,, "메모장")      ; 위치만 변경 (크기 유지)

WinHide / WinShow - 창 숨기기/보이기

WinHide("메모장")      ; 숨기기
WinShow("메모장")      ; 다시 보이기

🔧 실용적인 예제

예제 1: 앱 런처

#Requires AutoHotkey v2.0

; Win+숫자로 자주 쓰는 프로그램 실행/전환
#1::{
    if WinExist("ahk_exe notepad.exe")
        WinActivate
    else
        Run("notepad")
}

#2::{
    if WinExist("ahk_exe chrome.exe")
        WinActivate
    else
        Run("chrome")
}

#3::{
    if WinExist("ahk_exe Code.exe")
        WinActivate
    else
        Run("code")
}

예제 2: 창 정렬

; 현재 창을 화면 왼쪽 절반에 배치
#Left::{
    WinMove(0, 0, A_ScreenWidth/2, A_ScreenHeight, "A")
}

; 현재 창을 화면 오른쪽 절반에 배치
#Right::{
    WinMove(A_ScreenWidth/2, 0, A_ScreenWidth/2, A_ScreenHeight, "A")
}

💡 "A"현재 활성 창을 의미합니다!

예제 3: 새 크롬 창에서 검색

^!g::{  ; Ctrl+Alt+G
    query := InputBox("검색어 입력", "Google 검색").Value
    if (query != "")
        Run("https://www.google.com/search?q=" query)
}

예제 4: 여러 프로그램 한 번에 실행

#w::{  ; Win+W: 작업 환경 세팅
    Run("notepad")
    Run("calc")
    Run("https://www.google.com")

    Sleep 2000  ; 창들이 열릴 때까지 대기

    ; 창 정렬
    WinMove(0, 0, 600, 400, "ahk_exe notepad.exe")
    WinMove(600, 0, 400, 400, "ahk_exe calc.exe")
}

🖥️ 창 정보 얻기

WinGetTitle - 제목 얻기

title := WinGetTitle("A")  ; 활성 창 제목
MsgBox("현재 창: " title)

WinGetClass - 클래스 얻기

class := WinGetClass("A")
MsgBox("클래스: " class)

WinGetPos - 위치/크기 얻기

WinGetPos(&x, &y, &w, &h, "A")
MsgBox("위치: " x ", " y "`n크기: " w " x " h)

WinGetProcessName - 프로세스명 얻기

proc := WinGetProcessName("A")
MsgBox("프로세스: " proc)

🎭 특정 창에서만 동작하기

#HotIf 사용

; 메모장에서만 작동하는 핫키
#HotIf WinActive("ahk_exe notepad.exe")
^1::Send("메모장 전용 단축키!")
^2::Send(FormatTime(, "yyyy-MM-dd HH:mm:ss"))
#HotIf

; 크롬에서만 작동
#HotIf WinActive("ahk_exe chrome.exe")
^1::Send("^t")  ; 새 탭
^2::Send("^w")  ; 탭 닫기
#HotIf

⚠️ 주의사항

1. 창 제목 변경

파일을 편집하면 창 제목이 바뀝니다:

  • 저장 전: "제목 없음 - 메모장"
  • 저장 후: "myfile.txt - 메모장"
; ✅ ahk_exe 사용 권장
WinActivate("ahk_exe notepad.exe")

; 또는 부분 매칭
SetTitleMatchMode(2)
WinActivate("메모장")

2. 관리자 권한

관리자 권한으로 실행된 프로그램은 일반 AHK에서 제어 안 됩니다.
→ AHK도 관리자 권한으로 실행해야 함

3. UWP 앱 (스토어 앱)

계산기 등 Windows 10+ 기본 앱은 특수한 클래스를 가집니다:

; Windows 10+ 계산기
WinActivate("ahk_class ApplicationFrameWindow")

🎮 실습 과제

  1. Win+G → 구글 열기 (이미 열려있으면 활성화)
  2. Ctrl+Alt+T → 터미널(cmd) 열기
  3. Win+Shift+D → 바탕화면 폴더 열기
  4. Ctrl+Alt+C → 활성 창 정보(제목, 클래스, 위치) 표시
정답 보기 👀
#Requires AutoHotkey v2.0
SetTitleMatchMode(2)

#g::{
    if WinExist("Google")
        WinActivate
    else
        Run("https://www.google.com")
}

^!t::{
    Run("cmd")
}

#+d::{
    Run(A_Desktop)
}

^!c::{
    title := WinGetTitle("A")
    class := WinGetClass("A")
    WinGetPos(&x, &y, &w, &h, "A")
    MsgBox("제목: " title "`n클래스: " class "`n위치: " x ", " y "`n크기: " w " x " h)
}

📚 다음 시간 예고

다음 글에서는 변수와 데이터 타입을 배웁니다:

  • 변수 선언과 사용
  • 문자열, 숫자, 배열, 객체
  • 타입 변환

프로그래밍의 기초를 다져봅시다! 📊


🔑 오늘 배운 핵심 정리

함수 용도 예제
Run() 실행 Run("notepad")
RunWait() 실행 후 대기 RunWait("setup.exe")
WinActivate() 창 활성화 WinActivate("메모장")
WinWait() 창 대기 WinWait("메모장", , 5)
WinExist() 창 확인 if WinExist("메모장")
WinClose() 창 닫기 WinClose("메모장")
WinMove() 창 이동 WinMove(0, 0, 800, 600, "A")
WinGetTitle() 제목 얻기 WinGetTitle("A")

이전 글: [#5 키보드/마우스 입력 보내기]
다음 글: [#7 변수와 데이터 타입]

반응형