컨트롤러를 키보드나 마우스로 리매핑하기
컨트롤러를 키보드나 마우스로 리매핑하기 (Remapping a Controller to Keyboard or Mouse)
게임 컨트롤러(조이스틱 등)의 버튼·축을 키보드 키나 마우스 버튼으로 리매핑하는 다양한 방법을 설명하는 문서예요.
출처: 문서
본문
목차 (Table of Contents)
- 중요 주의 사항 (Important Notes)
- 서로 다른 접근 방식 (Different Approaches)
- 키 입력 자동 반복 (Auto-repeating a Keystroke)
- 문맥에 민감한 컨트롤러 버튼 (Context-sensitive Controller Buttons)
- 컨트롤러를 마우스로 사용하기 (Using a Controller as a Mouse)
- 컨트롤러 축 (Controller Axes)
- 컨트롤러 POV Hat
- 키 입력 자동 반복 (Auto-repeating a Keystroke)
- 주의 사항 (Remarks)
- 관련 주제 (Related Topics)
중요 주의 사항 (Important Notes)
- 역사적인 이유로 다음 버튼과 컨트롤 이름은 조이스틱(joystick)을 뜻하는 Joy로 시작해요. 하지만 그것들은 게임패드나 스티어링 휠 같은 다른 게임 컨트롤러에서도 보통 동작해요.
- 컨트롤러 버튼이나 축을 키나 마우스 버튼으로 리매핑할 수는 있지만, 다른 컨트롤러 버튼이나 축으로 리매핑할 수는 없어요. 그것은 vJoy 같은 컨트롤러 에뮬레이터의 도움을 통해서만 가능해요.
- AutoHotkey는 컨트롤러의 각 버튼을 1과 32 사이의 고유한 번호로 식별해요. 이 번호들을 알아내려면 컨트롤러 테스트 스크립트를 사용해요.
- Xbox 360 컨트롤러보다 새로운 Xbox 2013 및 이후 컨트롤러에서는 Joy1
Joy32 핫키가 스크립트가 소유한 창(메시지 상자, GUI, 또는 스크립트의 메인 창 같은 것)이 활성 상태일 때만 동작해요. 이 제한은 Joy1Joy32와 JoyX, JoyY, JoyZ, JoyR, JoyU, JoyPOV(그리고 아마 JoyV)에 대한 GetKeyState에도 적용되지만, JoyName, JoyButtons, JoyAxes, JoyInfo에는 적용되지 않아요. 다른 활성 창에서 그런 컨트롤러 입력을 감지하려면 XInput.ahk 라이브러리를 사용해요.
컨트롤러 버튼이 키 입력이나 마우스 클릭을 보내게 하기 (Making a Controller Button Send Keystrokes or Mouse Clicks)
서로 다른 접근 방식 (Different Approaches)
아래는 가장 간단한 것부터 가장 복잡한 것으로 끝나는 세 가지 접근 방식이에요. 가장 복잡한 방법은 가장 다양한 상황(키나 마우스 버튼을 누르고 있어야 하는 게임 같은)에서 동작해요.
방법 1 (Method #1)
이 방법은 단순한 키 입력과 마우스 클릭을 보내요. 예를 들어:
Joy1::Send "{Left}" *; 버튼 #1이 왼쪽 화살표 키 입력을 보내게 함.*
Joy2::Click *; 버튼 #2가 왼쪽 마우스 버튼 클릭을 보내게 함.*
Joy3::Send "a{Esc}{Space}{Enter}" *; 버튼 #3이 문자 "a" 다음에 Escape, Space, Enter를 보내게 함.*
Joy4::Send "Sincerely,{Enter}John Smith" *; 버튼 #4가 두 줄 서명을 보내게 함.*
버튼이 한 줄보다 많은 것을 수행하게 하려면 버튼 이름 아래에 놓고 중괄호로 감싸요. 예를 들어:
Joy5::
{
Run "notepad"
WinWait "Untitled - Notepad"
WinActivate
Send "This is the text that will appear in Notepad.{Enter}"
}
자세한 내용은 How to Write Hotkeys를 참조해요.
키와 마우스/컨트롤러 버튼의 전체 목록은 Key List를 참조해요.
방법 2 (Method #2)
이 방법은 컨트롤러 버튼을 누르고 있는 전체 시간 동안 키나 마우스 버튼을 누르고 있어야 하는 경우에 필요해요. 다음 예시는 컨트롤러의 두 번째 버튼이 왼쪽 화살표 키가 되게 해요:
Joy2::
{
Send "{Left down}" *; 왼쪽 화살표 키를 누르고 있음.*
KeyWait "Joy2" *; 사용자가 컨트롤러 버튼을 놓을 때까지 기다림.*
Send "{Left up}" *; 왼쪽 화살표 키를 놓음.*
}
방법 3 (Method #3)
이 방법은 방법 2에서 설명한 유형의 컨트롤러 핫키가 여러 개 있고, 그런 핫키를 가끔 동시에 누르고 놓을 때 필요해요. 다음 예시는 컨트롤러의 세 번째 버튼이 왼쪽 마우스 버튼이 되게 해요:
Joy3::
{
Send "{LButton down}" *; 왼쪽 마우스 버튼을 누르고 있음.*
SetTimer WaitForButtonUp3, 10
}
WaitForButtonUp3()
{
if GetKeyState("Joy3") *; 버튼이 여전히 눌려 있으므로 계속 기다림.*
return
*; 그렇지 않으면 버튼이 놓여졌음.*
Send "{LButton up}" *; 왼쪽 마우스 버튼을 놓음.*
SetTimer , 0
}
키 입력 자동 반복 (Auto-repeating a Keystroke)
일부 프로그램이나 게임은 키를 반복해서 보내야 할 수 있어요(키보드에서 계속 누르고 있는 것처럼). 다음 예시는 컨트롤러의 두 번째 버튼을 누르고 있는 동안 스페이스바 키 입력을 반복적으로 보내서 이를 달성해요:
Joy2::
{
Send "{Space down}" *; 스페이스바를 누름.*
SetTimer WaitForJoy2, 30 *; 30을 20이나 10으로 줄이면 키를 더 빨리 보냄. 늘리면 더 느리게 보냄.*
}
WaitForJoy2()
{
if not GetKeyState("Joy2") *; 버튼이 놓여졌음.*
{
Send "{Space up}" *; 스페이스바를 놓음.*
SetTimer , 0 *; 버튼 모니터링을 멈춤.*
return
}
*; 위에서 "return"하지 않았으므로 버튼이 여전히 눌려 있음.*
Send "{Space down}" *; 스페이스바 키 입력을 하나 더 보냄.*
}
문맥에 민감한 컨트롤러 버튼 (Context-sensitive Controller Buttons)
#HotIf 지시문은 어떤 조건(활성 창의 종류 같은 것)에 따라 선택한 컨트롤러 버튼이 다른 동작(또는 아무것도 안 함)을 수행하게 하는 데 사용될 수 있어요.
컨트롤러를 마우스로 사용하기 (Using a Controller as a Mouse)
Controller-To-Mouse 스크립트는 컨트롤러의 버튼과 축 제어를 리매핑해서 컨트롤러를 마우스로 변환해요.
다른 컨트롤러 컨트롤이 키 입력이나 마우스 클릭을 보내게 하기 (Making Other Controller Controls Send Keystrokes or Mouse Clicks)
스틱의 축이나 POV hat의 움직임에 응답하도록 스크립트를 만들려면 SetTimer와 GetKeyState를 사용해요.
컨트롤러 축 (Controller Axes)
다음 예시는 스틱의 X, Y 축이 키보드의 화살표 키 그룹(왼쪽, 오른쪽, 위, 아래)처럼 동작하게 해요:
SetTimer WatchAxis, 5
WatchAxis()
{
static KeyToHoldDown := ""
JoyX := GetKeyState("JoyX") *; X 축의 위치를 얻음.*
JoyY := GetKeyState("JoyY") *; Y 축의 위치를 얻음.*
KeyToHoldDownPrev := KeyToHoldDown *; Prev는 이제 이전에 눌렀던 키를 보관함(있다면).*
if JoyX > 70
KeyToHoldDown := "Right"
else if JoyX < 30
KeyToHoldDown := "Left"
else if JoyY > 70
KeyToHoldDown := "Down"
else if JoyY < 30
KeyToHoldDown := "Up"
else
KeyToHoldDown := ""
if KeyToHoldDown = KeyToHoldDownPrev *; 올바른 키가 이미 눌려 있음(또는 필요한 키가 없음).*
return *; 아무것도 하지 않음.*
*; 그렇지 않으면 이전 키를 놓고 새 키를 누름:*
SetKeyDelay -1 *; 키 입력 사이의 지연을 피함.*
if KeyToHoldDownPrev *; 놓을 이전 키가 있음.*
Send "{" KeyToHoldDownPrev " up}" *; 놓음.*
if KeyToHoldDown *; 누를 키가 있음.*
Send "{" KeyToHoldDown " down}" *; 누름.*
}
컨트롤러 POV Hat
다음 예시는 컨트롤러의 POV hat이 키보드의 화살표 키 그룹처럼 동작하게 해요. 즉 POV hat이 화살표 키 입력(왼쪽, 오른쪽, 위, 아래)을 보내요:
SetTimer WatchPOV, 5
WatchPOV()
{
static KeyToHoldDown := ""
POV := GetKeyState("JoyPOV") *; POV 컨트롤의 위치를 얻음.*
KeyToHoldDownPrev := KeyToHoldDown *; Prev는 이제 이전에 눌렀던 키를 보관함(있다면).*
*; 일부 컨트롤러는 고정 단위가 아닌 부드러운/연속적인 POV를 가질 수 있음.
; 모두 지원하려면 범위를 사용:*
if POV < 0 *; 보고할 각도 없음*
KeyToHoldDown := ""
else if POV > 31500 *; 315~360도: 앞으로*
KeyToHoldDown := "Up"
else if POV >= 0 and POV <= 4500 *; 0~45도: 앞으로*
KeyToHoldDown := "Up"
else if POV >= 4501 and POV <= 13500 *; 45~135도: 오른쪽*
KeyToHoldDown := "Right"
else if POV >= 13501 and POV <= 22500 *; 135~225도: 아래로*
KeyToHoldDown := "Down"
else *; 225~315도: 왼쪽*
KeyToHoldDown := "Left"
if KeyToHoldDown = KeyToHoldDownPrev *; 올바른 키가 이미 눌려 있음(또는 필요한 키가 없음).*
return *; 아무것도 하지 않음.*
*; 그렇지 않으면 이전 키를 놓고 새 키를 누름:*
SetKeyDelay -1 *; 키 입력 사이의 지연을 피함.*
if KeyToHoldDownPrev *; 놓을 이전 키가 있음.*
Send "{" KeyToHoldDownPrev " up}" *; 놓음.*
if KeyToHoldDown *; 누를 키가 있음.*
Send "{" KeyToHoldDown " down}" *; 누름.*
}
키 입력 자동 반복 (Auto-repeating a Keystroke)
위의 두 예시 모두 키를 그냥 누르고 있는 대신 반복해서 보내도록 수정할 수 있어요(즉, 키보드에서 물리적으로 키를 누르고 있는 것을 흉내 낼 수 있어요). 이렇게 하려면 다음 줄을:
return *; 아무것도 하지 않음.*
다음으로 바꿔요:
{
if KeyToHoldDown
Send "{" KeyToHoldDown " down}" *; 키 입력을 자동 반복.*
return
}
주의 사항 (Remarks)
첫 번째가 아닌 다른 컨트롤러는 버튼이나 축 이름 앞에 그 컨트롤러의 번호를 붙여서 사용할 수 있어요. 예를 들어 2Joy1은 두 번째 컨트롤러의 첫 번째 버튼이에요.
다른 유용한 컨트롤러 스크립트를 찾으려면 AutoHotkey 포럼을 방문해요. Controller and GetKeyState and Send 같은 키워드 검색은 관심 있는 주제를 찾게 해줄 가능성이 높아요.
관련 주제 (Related Topics)
- Controller-To-Mouse 스크립트 (컨트롤러를 마우스로 사용)
- 컨트롤러 버튼, 축, 컨트롤 목록
- GetKeyState
- 키보드와 마우스 리매핑