ETC/Auto Hotkey

AutoHotkey로 외부 프로그램 제어하기: DllCall과 COM 객체 활용

shimdh 2025. 2. 5. 11:06
728x90

1. DllCall: 외부 DLL 함수 호출하기

1.1 DllCall이란?

DllCall은 AutoHotkey에서 외부 DLL(동적 링크 라이브러리) 파일에 있는 함수를 호출할 수 있게 해주는 기능입니다. 이를 통해 시스템의 저수준 API와 상호작용하거나 다른 프로그램과 통신할 수 있습니다.

1.1.1 DLL이란?

DLL(Dynamic Link Library)은 여러 프로그램에서 공유하여 사용할 수 있는 코드와 데이터를 포함하는 파일입니다. 예를 들어, Windows 운영체제는 다양한 기본 기능을 제공하는 여러 DLL 파일을 포함하고 있습니다. DLL은 프로그램의 모듈화와 재사용성을 높이는 데 중요한 역할을 합니다.

1.1.2 DllCall의 구조

result := DllCall("함수 이름", "인자 타입", 인자1, "인자 타입", 인자2, ...)
  • 함수 이름: 호출하려는 DLL 내의 함수 이름입니다.
  • 인자 타입: 각 인자의 데이터 유형을 지정합니다 (예: "C"는 char, "I"는 int 등).
  • 인자: 실제로 전달할 값들입니다.

1.2 DllCall 예제

1.2.1 MessageBox 표시하기

Windows API를 이용해 간단한 메시지 박스를 표시하는 예제입니다.

; MessageBox 함수를 호출하여 메시지를 띄움
MsgBoxResult := DllCall("User32.dll\MessageBoxA", "UInt", 0, "Str", "안녕하세요!", "Str", "제목", "UInt", 0)

이 예제는 User32.dll에 있는 MessageBoxA 함수를 호출하여 간단한 메시지 박스를 표시합니다. UInt는 부호 없는 정수, Str은 문자열을 나타냅니다.

1.2.2 윈도우 핸들 가져오기

특정 윈도우의 핸들을 얻기 위해 FindWindow 함수를 사용하는 예제입니다.

hwnd := DllCall("User32.dll\FindWindowA", "Str", "", "Str", "계산기") ; 계산기의 창 핸들을 찾음
if (hwnd) {
    MsgBox % "핸들이 발견되었습니다: " hwnd
} else {
    MsgBox % "계산기를 찾을 수 없습니다."
}

이 예제는 FindWindowA 함수를 사용하여 "계산기" 창의 핸들을 찾습니다. 핸들은 윈도우를 식별하는 고유한 값으로, 이를 통해 해당 윈도우를 제어할 수 있습니다.

1.2.3 키보드 입력 시뮬레이션

SendInput 메서드를 활용해 키보드 입력을 자동으로 보내는 방법입니다.

; SendInput 함수를 통해 'Hello'라는 문자열 입력하기 
DllCall("user32.dll\SendInput"
    , UInt, 1      ; INPUT 구조체 배열 개수 
    , Ptr, &input  ; INPUT 구조체 포인터 
    , UInt, A_Gui ) ; INPUT 구조체 크기 

이 예제는 SendInput 함수를 사용하여 키보드 입력을 시뮬레이션합니다. INPUT 구조체를 사용하여 입력할 키를 지정할 수 있습니다.

1.2.4 시스템 시간 가져오기

현재 시스템 시간을 가져오는 예제입니다.

VarSetCapacity(systemTime, 16) ; SYSTEMTIME 구조체 크기 설정 (16바이트)
DllCall("GetSystemTime"
    , Ptr,&systemTime)         ; SYSTEMTIME 정보를 systemTime 변수에 저장

year := NumGet(systemTime, 0 * A_PtrSize)     ; 연도 정보 추출
month := NumGet(systemTime, 4 * A_PtrSize) + 1; 월 정보(0부터 시작하므로 +1)

MsgBox % year . "/" . month               ; 결과 출력

이 예제는 GetSystemTime 함수를 사용하여 현재 시스템 시간을 가져옵니다. SYSTEMTIME 구조체를 사용하여 연도와 월 정보를 추출합니다.


2. COM 객체: 외부 프로그램과의 상호작용

2.1 COM 객체란?

COM(Component Object Model)은 Microsoft에서 개발한 기술로, 서로 다른 프로그래밍 언어로 작성된 소프트웨어 컴포넌트 간에 통신할 수 있도록 해줍니다. AutoHotkey에서 COM 객체를 사용하면 다른 응용 프로그램과 데이터를 주고받거나 그 기능을 자동화할 수 있습니다.

2.1.1 COM 객체의 주요 특징

  • 언어 독립성: 다양한 프로그래밍 언어에서 사용할 수 있습니다.
  • 재사용성: 이미 만들어진 컴포넌트를 재사용할 수 있어 개발 시간을 단축시킵니다.

2.2 AutoHotkey에서 COM 객체 사용하기

AutoHotkey에서는 ComObjCreate 함수를 통해 새로운 COM 객체를 생성하거나 기존의 COM 서버에 연결할 수 있습니다.

2.2.1 기본 문법

obj := ComObjCreate("프로그램명")

2.3 COM 객체 예제

2.3.1 Excel 제어하기

Excel 애플리케이션을 자동으로 열고 셀에 값을 입력하는 방법입니다.

; Excel 애플리케이션 시작
excel := ComObjCreate("Excel.Application")
excel.Visible := true ; Excel 창을 표시합니다.

; 새 워크북 추가 및 데이터 입력
workbook := excel.Workbooks.Add()
sheet := workbook.Sheets(1)
sheet.Cells(1, 1).Value := "안녕하세요"
sheet.Cells(2, 1).Value := "AutoHotkey와 함께하는 Excel!"

; 작업 완료 후 저장 및 종료
workbook.SaveAs("C:\example.xlsx")
excel.Quit()

이 예제는 Excel 애플리케이션을 시작하고, 새 워크북을 추가한 후 셀에 텍스트를 입력하고 파일로 저장합니다.

2.3.2 Internet Explorer 조작하기

Internet Explorer 브라우저를 통해 웹 페이지를 여는 방법입니다.

; Internet Explorer 시작
ie := ComObjCreate("InternetExplorer.Application")
ie.Visible := true ; IE 창을 표시합니다.

; 웹 페이지 열기
ie.Navigate("http://www.example.com")

; 로딩 대기 (최대 10초)
while ie.Busy || ie.ReadyState != 4 {
    Sleep, 100 ; 잠시 대기합니다.
}

MsgBox % "페이지 제목: " . ie.LocationName ; 현재 페이지 제목 표시

; IE 종료
ie.Quit()

이 스크립트는 Internet Explorer를 실행하고 지정된 URL로 이동한 후 로딩이 완료되면 페이지 제목을 메시지 박스로 보여줍니다.


2.4 주의사항 및 팁

  • COM 서버가 설치되어 있어야 합니다: 특정 프로그램과 연동하려면 해당 프로그램이 시스템에 설치되어 있어야 합니다.
  • 권한 문제 확인: 일부 응용 프로그램은 관리자 권한으로 실행해야 할 수도 있습니다.
  • 오류 처리 고려하기: COM 호출 중 오류가 발생할 경우 적절히 처리하도록 코드를 작성하세요.
try {
    obj := ComObjCreate("SomeApp.Application")
} catch e {
    MsgBox % "COM 객체 생성 실패! 오류 내용: " . e.Message 
}

3. DllCall과 COM 객체의 비교

3.1 DllCall의 장단점

  • 장점: 시스템의 저수준 API에 직접 접근할 수 있어 매우 강력하고 유연합니다.
  • 단점: 사용하기 어렵고, 잘못 사용하면 시스템에 치명적인 오류를 일으킬 수 있습니다.

3.2 COM 객체의 장단점

  • 장점: 사용하기 쉽고, 다양한 프로그램과의 상호작용이 가능합니다.
  • 단점: 특정 프로그램이 설치되어 있어야 하며, 권한 문제가 발생할 수 있습니다.

4. 고급 활용 사례

4.1 DllCall을 이용한 고급 마우스 제어

; 마우스 이동 및 드래그
DllCall("user32.dll\SetCursorPos", "Int", 100, "Int", 100)
DllCall("user32.dll\mouse_event", "UInt", 0x02, "UInt", 0, "UInt", 0, "UInt", 0, "UInt", 0) ; 왼쪽 버튼 누름
DllCall("user32.dll\SetCursorPos", "Int", 200, "Int", 200)
DllCall("user32.dll\mouse_event", "UInt", 0x04, "UInt", 0, "UInt", 0, "UInt", 0, "UInt", 0) ; 왼쪽 버튼 뗌

이 예제는 마우스를 이동시키고 드래그하는 방법을 보여줍니다.

4.2 COM 객체를 이용한 Word 문서 생성

; Word 애플리케이션 시작
word := ComObjCreate("Word.Application")
word.Visible := true ; Word 창을 표시합니다.

; 새 문서 추가 및 데이터 입력
doc := word.Documents.Add()
doc.Content.Text := "안녕하세요, AutoHotkey로 생성된 Word 문서입니다."

; 작업 완료 후 저장 및 종료
doc.SaveAs("C:\example.docx")
word.Quit()

이 예제는 Word 애플리케이션을 시작하고, 새 문서를 추가한 후 텍스트를 입력하고 파일로 저장합니다.


5. 결론

AutoHotkey의 DllCallCOM 객체 기능은 스크립트를 더욱 강력하게 만들어 줍니다. DllCall을 통해 시스템의 저수준 API와 상호작용할 수 있고, COM 객체를 통해 다른 응용 프로그램과의 통신 및 자동화가 가능합니다. 위에서 설명한 기본적인 사용법과 실습 사례를 바탕으로 여러분이 필요로 하는 다양한 작업에 적합한 방식으로 활용해 보세요!

728x90