메뉴 여닫기
개인 메뉴 토글
로그인하지 않음
만약 지금 편집한다면 당신의 IP 주소가 공개될 수 있습니다.

Autoit 토글상태 체크 와 해제방법

데브카페

Autoit 토글상태 체크 와 해제방법

  • AutoIt에서 Send("^c") 실행 후 컨트롤 키가 토글되어 계속 눌린 상태가 될 때, 이 상태를 감지하고 토글을 해제하는 몇 가지 방법이 있습니다.
  • AutoIt 자체에는 컨트롤 키의 현재 "토글" 상태를 직접 감지하는 내장 함수는 없지만, 우회적인 방법들을 사용할 수 있습니다.

Send("{LControl Up}") 또는 Send("{RControl Up}") 강제 실행

  1. 가장 간단하고 직접적인 방법은 Send("^c")를 보낸 직후에 컨트롤 키를 강제로 떼는 명령을 보내는 것입니다. 대부분의 경우 이 방법으로 문제가 해결됩니다.
    Send("^c")
    ; 잠시 대기하여 Send 명령이 완전히 처리되도록 합니다.
    Sleep(100)
    ; 왼쪽 컨트롤 키를 강제로 떼는 명령
    Send("{LControl Up}")
    ; 오른쪽 컨트롤 키를 강제로 떼는 명령 (필요한 경우)
    Send("{RControl Up}")
    설명:
* Send("{LControl Up}"): 왼쪽 컨트롤 키를 떼는 이벤트를 보냅니다.
* Send("{RControl Up}"): 오른쪽 컨트롤 키를 떼는 이벤트를 보냅니다.
* Sleep(100): Send("^c") 명령이 시스템에 완전히 전달되고 처리될 시간을 줍니다. 너무 짧으면 문제가 발생할 수 있습니다.

Send("{LControl}") 또는 Send("{RControl}")를 이용한 토글

  1. 컨트롤 키가 토글된 상태라면, 해당 컨트롤 키를 다시 한 번 누르는 것(Send("{LControl}"))이 토글을 해제하는 방법이 될 수 있습니다. 이는 시스템이 해당 키를 누르는 것으로 인식하고 상태를 변경할 것이기 때문입니다.
    Send("^c")
    Sleep(100)
    ; 왼쪽 컨트롤 키를 다시 한 번 눌러 토글 해제 시도
    Send("{LControl}")
    ; 오른쪽 컨트롤 키도 다시 한 번 눌러 토글 해제 시도 (필요한 경우)
    Send("{RControl}")
    • 설명:
* 이 방법은 컨트롤 키가 "토글" 상태로 고정되는 특정 상황에서 유용합니다. 일반적인 Send("^c")는 컨트롤 키를 누른 상태에서 'c'를 누르고 바로 떼는 것이므로, 이런 문제가 발생한다면 시스템 또는 특정 애플리케이션과의 상호작용 방식 때문일 수 있습니다.

BlockInput을 이용한 키 입력 방지 (더 강력한 방법)

  1. BlockInput 함수를 사용하여 스크립트 실행 중 사용자 또는 다른 프로그램의 키보드/마우스 입력을 일시적으로 차단할 수 있습니다. 이를 통해 Send("^c") 명령이 의도치 않은 상태로 남는 것을 방지할 수 있습니다.
    BlockInput(1) ; 키보드/마우스 입력 차단 시작
    Send("^c")
    Sleep(100)
    Send("{LControl Up}") ; 확실히 떼기
    Send("{RControl Up}") ; 확실히 떼기
    BlockInput(0) ; 키보드/마우스 입력 차단 해제
    • 설명:
* BlockInput(1): 스크립트가 키 입력을 보내는 동안 다른 입력이 간섭하는 것을 막아줍니다.
* BlockInput(0): 작업을 마친 후에는 반드시 해제해야 합니다. 그렇지 않으면 사용자가 컴퓨터를 제어할 수 없게 됩니다.

GetAsyncKeyState를 이용한 실시간 감지 (고급)

  1. 이 방법은 DLLCall을 통해 Windows API 함수인 GetAsyncKeyState를 호출하여 특정 키의 현재 상태를 확인할 수 있습니다.
  2. 이는 실시간으로 키 눌림 상태를 확인해야 할 때 유용합니다. 하지만 설정이 좀 더 복잡합니다.
    
    ; DllCall 선언 (한 번만 선언하면 됩니다)
    Global Const $VK_LCONTROL = 0xA2 ; 왼쪽 컨트롤 키 가상 키 코드
    Global Const $VK_RCONTROL = 0xA3 ; 오른쪽 컨트롤 키 가상 키 코드
    
    ; 함수 정의
    Func IsControlKeyDown()
        Local $iLControlState = DllCall("user32.dll", "short", "GetAsyncKeyState", "int", $VK_LCONTROL)
        Local $iRControlState = DllCall("user32.dll", "short", "GetAsyncKeyState", "int", $VK_RCONTROL)
    
        ; GetAsyncKeyState의 반환 값은 최상위 비트(bit 15)가 설정되면 키가 눌려 있는 상태
        If BitAND($iLControlState[0], 0x8000) Or BitAND($iRControlState[0], 0x8000) Then
            Return True
        Else
            Return False
        EndIf
    EndFunc
    
    ; 사용 예시
    Send("^c")
    Sleep(100)
    
    If IsControlKeyDown() Then
        ConsoleWrite("컨트롤 키가 눌려있는 상태입니다. 토글 해제를 시도합니다." & @CRLF)
        Send("{LControl Up}")
        Send("{RControl Up}")
        Sleep(50) ; 충분히 해제될 시간
    EndIf
    • 설명:
* GetAsyncKeyState: 특정 가상 키 코드(Virtual Key Code)를 인자로 받아 해당 키의 현재 상태를 반환합니다. 반환 값의 최상위 비트(0x8000)가 설정되어 있으면 키가 현재 눌려있는 상태입니다.
* $VK_LCONTROL, $VK_RCONTROL: 왼쪽/오른쪽 컨트롤 키에 해당하는 가상 키 코드입니다.
* 이 방법은 문제 발생 여부를 직접 확인하고 조치할 수 있다는 장점이 있지만, DllCall에 대한 이해가 필요합니다.


권장하는 방법

  1. 대부분의 경우 1번 (Send("{LControl Up}") 강제 실행) 방법이 가장 간단하고 효과적입니다.
  2. 만약 이 방법으로도 문제가 해결되지 않는다면, 3번 (BlockInput) 을 고려해보고, 더 정밀한 제어가 필요하거나 특정 상황에서만 문제가 발생하는 경우 4번 (GetAsyncKeyState) 을 사용할 수 있습니다.
  3. 문제가 발생하는 특정 애플리케이션이나 상황이 있다면, 해당 정보를 함께 고려하여 더 적절한 해결책을 찾을 수 있습니다.

Comments