NGMsoftware

NGMsoftware
로그인 회원가입
  • 매뉴얼
  • 학습
  • 매뉴얼

    학습


    오토핫키 오토핫키 매크로 만들기. (키보드 입력)

    페이지 정보

    본문

    안녕하세요. 엔지엠소프트웨어입니다. 오토핫키를 이용한 매크로 만들기 3번째 이야기입니다^^; 오늘은 키보드를 제어하는 방법에 대해 자세하게 알아보도록 할께요. 우선, 오토핫키를 개발할 수 있는 환경을 만들어야 하는데요. 아직 개발 환경이 없는 분들은 1부 내용과 2부 내용을 참고하시기 바랍니다.

    1부 - 오토핫키 개발 환경 만들기 ]

    2부 - 오토핫키 마우스 매크로 만들기 ]

     

    비주얼 스튜디오 코드(VSCode)를 실행하고, 새로운 스크립트를 추가합니다. 아래 그림과 같이 저는 "keyboard.ahk"를 만들었습니다.

    JiN48Lk.png

     

     

    오토핫키 키보드 입력 테스트

    아래와 같은 코드를 작성 해줍니다. 1초 쉬었다가~ NGM을 입력하고, software를 입력합니다. 그리고, 마지막에 엔터(Enter)로 줄바꿈 해줍니다.

    #SingleInstance, Force
    SendMode Input
    Sleep, 1000
    SetWorkingDir, %A_ScriptDir%
    SendInput, NGM
    SendInput, software
    Send {Enter}

     

     

    이 스크립트를 실행 해보면 아래 동영상과 같이 동작하는걸 확인할 수 있습니다. 메모장에 NGMsoftware를 입력하고, 줄바꿈이 됩니다.

    SaiPAIl.gif

     

     

    키보드를 입력할 때 send와 sendInput을 사용했습니다. send는 문자를 하나씩 처리하고, sendInput은 한번에 처리합니다. 이 둘의 차이를 확인하기 위해 코드를 아래와 같이 변경하고 다시 실행 해보세요. sendInput을 send로 모두 변경했습니다. 이 테스트는 유심히 봐야 합니다. 한문자씩 입력한다고 해도 식별하기 어려울정도로 빠르니까요^^;

    #SingleInstance, Force
    SendMode Input
    Sleep, 1000
    SetWorkingDir, %A_ScriptDir%
    Send, 안녕하세요. 엔지엠소프트웨어입니다.
    Send, 오토핫키를 학습하는 뉴비입니다. 같이 열심히 공부합니다!!
    Send {Enter}

    8yks73d.gif

     

     

    오토핫키와 NGM매크로 차이점

    여러분들도 한글이 정상적으로 표시되지 않을 수 있습니다. 엔지엠 에디터로 동일하게 테스트를 해볼까요?

    tGuvMI8.png

     

     

    키보드 입력 액션으로 엔터도 추가 해줍니다.

    7zda2OY.png

     

     

    엔지엠 에디터에서는 한글이 정상적으로 입력되는걸 확인할 수 있습니다.

    7dSt8Xh.gif

     

     

    오토핫키는 외국에서 개발된 프로그램입니다. 그래서, 한글에 대한 지원이 잘되지는 않습니다. 그렇다고해서 사용할 수 없는건 아닌데요. 프로그램의 인코딩을 변경해주면 정상적으로 이용이 가능합니다. Visual Studio Code의 하단에 UTF-8을 클릭하세요.

    r98lSMq.png

     

     

    인코딩하여 다시 열기는 1회성으로 현재 파일의 인코딩을 변경해서 다시 열어줍니다. 저처럼 이것저것 마구 개발하는 경우에는 첫번째로 테스트를 해볼 수 있습니다. 두번째 옵션은 인코딩 설정을 기본으로 처리해줍니다. 오토핫키를 이용해서 매크로를 개발하는 경우 이 옵션으로 설정해주면 됩니다.

    revFXmG.png

     

     

    한국어(Korean (EUC-KR)로 설정 해주세요.

    gPalx9u.png

     

     

    참고로, 간단한 메모장과 같은 프로그램을 에디터로 사용한다면 인코딩이 몇개 없을 수 있습니다. 이런 경우에는 유니코드로 변경하고 저장하면 됩니다. 콘트롤+S를 눌러서 파일을 다시 저장하고, 실행 해보세요. 아래 동영상처럼 한글이 정상적으로 표시되는걸 확인할 수 있습니다.

    rPgheoN.gif

     

     

    다시 코드로 돌아와서 중괄호(ex: {Enter})를 사용하면 키보드의 키를 누르게 됩니다. Enter는 문자를 타이핑하게 되고, {Enter}는 키보드의 엔터키를 누릅니다. 그래서, 코드의 마지막줄에 send {Enter}로 줄바꿈을 해준것입니다. 이건 꼭 기억하고 넘어가야 합니다. 줄바꿈이나 스페이스, 백스페이스와 같이 자주 사용되니까요. 마지막으로 한영에 대해 알아볼께요. 코드를 아래와 같이 변경 해줍니다. 마지막줄에 "Welcome to NGMsoftware!" 영어가 추가 되었습니다.

    #SingleInstance, Force
    SendMode Input
    Sleep, 1000
    SetWorkingDir, %A_ScriptDir%
    Send, 안녕하세요. 엔지엠소프트웨어입니다.
    Send, 오토핫키를 학습하는 뉴비입니다. 같이 열심히 공부합니다!!
    Send, Welcome to NGMsoftware!
    Send {Enter}

    vPuAE24.gif

     

     

    여기서 생각해볼 문제가 하나 있습니다. 우리가 메모장에 텍스트를 입력할 때 한글을 입력하다가 영어를 입력하려면 어떻게 할까요? 한영 변환 키를 누르겠죠? 아쉽게도 오토핫키에서 한영키는 버추얼 키코드를 사용해야 합니다. 한영키는 vk15sc138입니다. 몇몇 이름으로 매핑되지 않은 가상키들은 어쩔 수 없이 외워야 하는데요. 개발자도 이런걸 외워서 사용하는 경우는 거의 없습니다. 가상 키코드는 마이크로소프트 홈페이지에 정리되어 있습니다. 아래 링크를 참고하세요.

    Virtual Keycode List ]

    #SingleInstance, Force
    SendMode Input
    Sleep, 1000
    SetWorkingDir, %A_ScriptDir%
    Send, 안녕하세요. 엔지엠소프트웨어입니다.
    Send, 오토핫키를 학습하는 뉴비입니다. 같이 열심히 공부합니다!!
    send, {vk15sc138}
    Send, Welcome to NGMsoftware!
    Send {Enter}

    evr5fey.gif

     

     

    엔지엠 에디터에서도 동일하게 테스트 해봅시다. [ 텍스트 쓰기 ] 액션의 마지막에 영어를 추가 했습니다.

    sLQVVM4.png

     

     

    실행하면 한영키를 누르지 않았는데도 자동으로 변환되는걸 알 수 있습니다. 엔지엠 매크로에는 IME(한영) 모드를 감지해서 자동으로 처리할 수 있는 스마트한 기능이 포함되어 있기 때문입니다. 그렇다고 해서 오토핫키를 개발할 때 항상 한영키를 고려해가면서 코딩해야 하는건 아닙니다. 복잡한 자동화 매크로를 만들 때 이런것들이 의도하지 않은 동작을 유발하거나 버그를 만들기 때문입니다.

    TflfOyd.gif

     

     

    오토핫키(AutoHotKey)에서 문자를 감지해서 한영키를 누르려면 아래와 같이 함수를 만들어서 체크해도 됩니다. 코드가 생각보다 간단해서 쉽게 이해할 수 있는데요. IME_CHECK에 특정 창의 이름을 넘기면 해당 창의 IME 모드를 감지해서 한영키를 누르도록 해줍니다.

    App  key:          -> English Mode
    Right-win key:     -> Hangul Mode
    
    IME_CHECK(WinTitle)
    {
        WinGet,hWnd,ID,%WinTitle%
        Return Send_ImeControl(ImmGetDefaultIMEWnd(hWnd),0x005,"")
    } 
    
    Send_ImeControl(DefaultIMEWnd, wParam, lParam)
    {
        DetectSave := A_DetectHiddenWindows      
        DetectHiddenWindows,ON                          
    
         SendMessage 0x283, wParam,lParam,,ahk_id %DefaultIMEWnd%
        if (DetectSave <> A_DetectHiddenWindows)
            DetectHiddenWindows,%DetectSave%
        return ErrorLevel
    } 
    
    ImmGetDefaultIMEWnd(hWnd)
    {
        return DllCall("imm32\ImmGetDefaultIMEWnd", Uint,hWnd, Uint)
    }
    
    Rwin::
        ret := IME_CHECK("A")
        if %ret% = 0                 ; 0 :English
        {
            Send, {vk15sc138}  
        }
    return 
    
    AppsKey::
        ret := IME_CHECK("A")
        if %ret% <> 0               ; 1 Hangul
        {
            Send, {vk15sc138}  
         }
    return

     

    아직 오토핫키의 함수에 대해 배우질 않았기 때문에 이렇게 사용할 수 있다는 정도만 알고 넘어가도 될거 같습니다. 오토핫키도 엄연히 프로그래밍 언어입니다. 그렇다보니 깊이 들어갈수록 어려워질 수 밖에 없습니다. 대부분 오토핫키의 엄청난 기능들을 다 활용하지 못하고, 자주 사용하는 몇가지를 반복하면서 만듭니다. 예를 들어 마우스 클릭, 슬립, 키보드 입력등등... 여기서 좀 더 발전하면 비활성으로 동작할 수 있는 API들을 좀 더 사용합니다. 마음에 여유를 가지고 천천히 하나씩 하다보면 언젠가는~ 자신의 업무를 완벽하게 자동화 할 수 있는 날이 올겁니다. 포기하지만 않는다면요^^

     

    개발자에게 후원하기

    MGtdv7r.png

     

    추천, 구독, 홍보 꼭~ 부탁드립니다.

    여러분의 후원이 빠른 귀농을 가능하게 해줍니다~ 답답한 도시를 벗어나 귀농하고 싶은 개발자~

    감사합니다~

    • 네이버 공유하기
    • 페이스북 공유하기
    • 트위터 공유하기
    • 카카오스토리 공유하기
    추천0 비추천0

    댓글목록

    등록된 댓글이 없습니다.