오토핫키 getkeystate 예제 - otohaski getkeystate yeje

키보드나 mouse button의 눌러 인하 상태, 죠이스틱 상태를 취득

GetKeyState, OutputVar, KeyName [, Mode] 

Parameters

인수명설명
OutputVar 결과를 격납하는 변수명.
취득에 실패하면, 내용은 비운다.
KeyName 상태를 취득하고 싶은 키의 명칭.
특수 키의 일람은Key List참조.
Mode 「P」(을)를 지정하면, 소프트웨어적인 키보드 이벤트 생성을 무시해, 실제로 유저가 키를 누르고 있는지를 취득할 수 있다.(NT계 전용)(#InstallKeybdHook,#InstallMouseHook(을)를 기술하는 등,Hook(을)를 유효하게 하고 있을 필요 있어)
「T」(을)를 지정하면,CapsLock,NumLock,ScrollLock의ON/OFF상태를 취득할 수 있다.
이 경우,ON(이)라면 「D」,OFF(이)라면 「U」(이)가 된다.
이 인수는 생략 가능하고, 죠이스틱에서는 무효.

Remarks

버튼의 경우, 눌러 인하 상태라면 「D」, 밀리지 않으면 「U」(이)가OutputVar의 변수에 격납된다.
죠이스틱의 축(JoyX등)의 경우,0...100의 사이의 소수로 쓰러지는 상태가 나타내진다.(50(이)라면 쓰러지지 않았다)(수치의 서식은SetFormat그리고 지정 가능)
JoyPOV의 경우,0...35900의 값이 된다.정면을0(으)로 한 각도를100배가 된 것이 되는 모양.

Related

Key List, KeyHistory, #InstallKeybdHook, #InstallMouseHook, GetKeyState()

Example(s)

; Basic Examples:
GetKeyState, state, Shift
GetKeyState, state, CapsLock, T ; D if CapsLock is ON or U otherwise.
GetKeyState, state, RButton ; Right mouse button.
GetKeyState, state, Joy2 ; The second button of the first joystick.

; Advanced Example:
; In this case, the mouse button is kept held down while NumpadAdd
; is down, which effectively transforms NumpadAdd into a mouse button.
; This method can also be used to repeat an action while the user is
; holding down a key or button:
NumpadAdd::
MouseClick, left, , , 1, 0, D  ; Hold down the left mouse button.
Loop
{
	Sleep, 10
	GetKeyState, state, NumpadAdd, P
	if state = U  ; The key has been released, so break out of the loop.
		break
	; ... insert here any other actions you want repeated.
}
MouseClick, left, , , 1, 0, U  ; Release the mouse button.
return

; Example: Make joystick button behavior depend on joystick axis position.
joy2:: 
GetKeyState, joyx, JoyX 
if joyx > 75 
	MsgBox Action #1 (button pressed while joystick was pushed to the right)
else if joyx < 25 
	MsgBox Action #2 (button pressed while joystick was pushed to the left)
else
	MsgBox Action #3 (button pressed while joystick was centered horizontally)
return

사용법 (초급)

오토핫키 사용법8 - 작업 반복 (Repeating a series of actions over and over)

작업 반복은 매우 간단합니다.

Loop(루프)를사용 하면 됩니다. 만약 작업을 10번 반복 하고 싶다면 Loop, 10 {작업내용} 또는 Loop 10 {작업내용} 이렇게 작업내용 앞에 사용해 주시면 됩니다.

(10이라는 숫자를 대신해 숫자값이 들어간 변수명을 사용해도 상관 없습니다.)

다음 예제는 Loop를 이용해서 작업을 3번 반복하는 예제입니다.

F1::

Counter = 0

Loop 3

{

Counter = Counter + 1

MsgBox 반복 획수 = %Counter% 

}

변수 Counter를 만들고 Loop 3을 입력해서 블록{}내용을 3번 반복합니다.

블록 않에 Counter = Counter + 1을 입력하여 작업이 반복 될때마다 1씩 값을 증가 하도록 했습니다.

그리고 메시지 상자를 통해 반복 횟수를 출력하게 해 놓았습니다.

만약 Loop 뒤에 값을 넣지 않으면 무한 루프가 되어버립니다.

계속 반복 한다는 것이죠. 만약 특정한 조건이 되기 전까지 계속 루프를 돌리고 싶다면 무한루프를 만들고 특정 조건식이 만족하면

block를 사용해서 멈추게 할 수 있습니다.

예제를 통해서 한번 해 보겠습니다.

 F1::

Counter = 10                           ; Counter에 10을 넣습니다.

Loop                                      ; 값을 넣지 않아서 무한 루프가 됩니다.

{

if Counter < 0                          ; Counter가 0보다 작으면 Break를 해서 작업을 중지 합니다.

Break

else                                      ; Counter가 0보다 크다면 아래 한줄을 실행합니다.

MsgBox %Counter%               ; 메시지 박스를 출력합니다. 내용은 Counter 값

Counter := Counter - 1            ; Counter가 자기 자신의 값에 -1 을 해서 값을 저장합니다.(루프를 반복하면서 -1씩 값을 빼는거죠.)

}

Counter의 값이 0이되어  Break를 실행하기 전까지 무한루프를 돌고 있습니다.

이렇게 특정한 값이 나올때까지 반복시키고 싶을때 무한 루프를 돌리 면 됩니다.

다음 예제를 보기 전에 잠시 아래 동영상을 보겠습니다.

동영상을 보면 모터 회전축의 약간 벗어난 곳에 무게추를 달아서 반동을 주는 기구를 만들었습니다.

그 기구를 손가락에 장착 후 마우스와 키보드를 연타를 하고 있는데 무한루프를 이용하면 보다 편하고 빠르게 마우스와 키보드를 클릭 할 수 있습니다.

다음 예제를 복사해서 붙여 놓으신후 F1키를 누르면 무한 클릭을 실행합니다.

$F1::                                   ; F1키를 단축키로 만듬 ($ 기호는 아래의 GetkeyState의 "P" 모드를 가능하게 합니다)

Loop                                   ; 숫자를 지정하지 않았기 떄문에, "break"또는 "return"을 만나기 전까지 무한루프(무한반복)가 됩니다.

{

if not GetKeyState("F1", "P")   ; if 문이 참이면, F1키는 눌러지지 않은 상태입니다.

break                                  ; 루프(반복)를 종료합니다.

else                                    ; 아니라면(위에서 "break" 안하면) 마우스 계속 클릭.

Click                                   ; 커서의 현재 위치에서 마우스 왼쪽버튼 클릭.

}

 F1을 누르고 있으면 무한 클릭을 합니다. 더 간단한 방법으로 루프를 돌리지 않고 Click 값에 500 정도만 넣어주면 10초동안 500회를 클릭이 가능합니다.

 클릭이 얼마나 빠르게 되는지 확인 하고 싶으신분은 첨부자료 클릭테스트프로그램 실행해서 테스트 하시기 바랍니다. 

(설치프로그램이 아니라 바로 실행가능한 프로그램이니 부담없이 사용하실 수 있습니다.)

While 를 통해서도 Loop와 동일한 작업을 할 수 있습니다.

$F1::

while GetKeyState("F1", "P")  ; F1 키를 누르고 있는 동안

{

    Click

}

return

루프와일에 대한 자세한 내용은 "loop", "while" 링크를 참조 하시기 바랍니다.

겟키스테이트에 대한 자세한 내용은  "GetKeyState" 링크를 참조 하시기 바랍니다.

마지막으로 앞에서 사용한 가위바위보 게임 예제에  오늘 배운 Loop를 적용해 보겠습니다.

F1::

win = 0                            ; 승리 횟수 저장변수

lose = 0                           ; 패배 횟수 저장변수

draw = 0                          ; 무승부 횟수 저장변수

Loop 3                             ; 3회 반복

{                                     ; 블록{ }을 이용해서 작업 내용을 지정합니다.

    InputBox, User1, 가위바위보 게임, 어떤 손을 내실 건가요?`n(가위/바위/보) `n게임을 끝내실려면 "그만"을 입력하세요., , 300, 200, , , , ,가위 

    Random, User2, 1, 3

    if User1 = 가위

    {

        if User2 = 1

        {

            draw := draw + 1

            MsgBox 비겼습니다.

        }

        else if User2 = 2

        {

            MsgBox 졌습니다.

            lose := lose + 1

        } 

        else if User2 = 3

        {

            MsgBox 이겼습니다.

            win := win + 1

        }

    }

    else if User1 = 바위

    {

        if User2 = 2

        {

            MsgBox 비겼습니다.

            draw := draw + 1

        }

            else if User2 = 3

        {

            MsgBox 졌습니다.

            lose := lose + 1

        }

            else if User2 = 1

        {

            MsgBox 이겼습니다.

            win := win + 1

        }

    }

    else if User1 = 보

    {

        if User2 = 3

        {

            MsgBox 비겼습니다.

            draw := draw + 1

        }

        else if User2 = 1

        {

            MsgBox 졌습니다.

            lose := lose + 1

        }

        else if User2 = 2

        {

            MsgBox 이겼습니다.

            win := win + 1

        }

    }

    else if User1 = 그만                   ;"그만" 을 입력하면 Break를 실행하여 루프를 중지 시킵니다.

    Break

    else

    MsgBox 잘못 입력 하셨습니다.

}

MsgBox 당신의 전적은 `n%Win% 승, %lose% 패, %draw% 무 입니다.

이전과 달리 작업을 3번 반복 합니다.

그리고 예제를 보면 else if 문에 블록{}을 사용했습니다. 전에는 1개의 문장만 사용했지만 이번에는 승,패,무의 횟수를 저장하기 위해

각 else if 문에 2개 이상의 문장 및 식을 사용하고 있기 때문에 블록{}을 상용했습니다. 

if문을 사용할때 블록{}이 없다면 if문 다음에 오는 첫 줄만 if문을 적용 받고 다음 줄은 if문이 아닌것으로 취급됩니다.

그래서 여러 줄로 이루어진 작업 경우 블록{}문을 사용해 묶어줘야 제대로 인식을 할 수 있습니다.

이것으로 작업 반복 사용법을 마치겠 습니다.