본문 바로가기
programming language/Autohotkey

Autohotkey Windows 한/영 상태 확인

by 남성 2016. 10. 17.
반응형

Autohotkey 를 사용하여 영문 Send 를 할 때~ 한/영 자판의 상태에 따라 영문이 들어가기도 하고 한글이 들어가기도 합니다.

 

재수 좋게 영문으로 되어 있는 상태에서 send 를 한다면 정상적으로 동작하겠지만 한글로 된 상태에서 send 를 한다면 한글로 이상하게 들어가는 경우가 발생을 합니다.

 

예를 들어 아래 명령어를 메모장과 같은 에디터에서 한글 상태에서 실행한다면~ "며새ㅙ사됴" 로 나오게 될 겁니다.

 

Send, Autohotkey

 

Autohotkey 를 사용하여 한영 자판에 상태를 확인할 수 있는 방법을 검색 하다 보니 아래 주소에 그 해결 방법이 나오더군요.

 

http://www.autohotkey.co.kr/cgi/board.php?bo_table=qna&wr_id=20839

 

역시나 내가 생각하는 대부분의 문제들은 이미 누군가가 해결 해 놓은 경우가 많다는걸 다시 한번 느낍니다.

 

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)

}

 

위 함수를 사용하여 현재 실행되는 프로그램의 한영상태를 확인하는 코드는 아래와 같습니다. 한글이면 1 영문이면 0이 나옵니다.

 

ret:=IME_CHECK("A") 

MsgBox % ret

 

위 함수를 사용하여 다음과 같이 한/영 상태에 따라 적절히 send 하는 명령어를 만들 수가 있습니다.

 

sendEng(textV)

{

    ret:=IME_CHECK("A") 

    If ret=1

    {

        Send, {vk15sc1F2}

    }    

    SendInput %textV%

    If ret=1

    {

        Send, {vk15sc1F2}

    }

}

 

한글 상태이면 영어로 바꿔 준 후에 send 를 하고 다시 한글 상태로 복귀 시킵니다.

 

다음과 같이 사용하시면 됩니다. 

sendEng("Autohotkey")


반응형

댓글6

  • 변영석 2018.12.01 14:54

    제일 아래의 sendEng(textV)예제에서
    sendinput %textV%
    다음 줄에
    ret:=IME_CHECK("A")
    이 다시 한번 와야 그 다음중
    if ret=1
    이 의미가 있을 것 같습니다.
    예를 들어서 영문 스트링을 넣고나서 한글 입력 상태로 바꾼다거나 하는 응용을 할 때에.

    답글

    • 남성 2018.12.02 12:13 신고

      음 그런가요? 영문을 넣고나서 기존에 한글이었으면 한글로 영문이었으면 영문으로 복귀하는건데 ..... 암튼 현재 저는 정상적으로 사용중인 코드입니다.

  • ㅇㅇ 2019.03.26 11:47

    안녕하십니까. 한영전환 스크립트가 많은 도움이 되었는데 SetKeyDelay 딜레이를 늘려도 글자수가 늘어나면 글자를 자꾸 빼먹습니다.
    "테스트 입니다 안녕" 이렇게 보내면 "스트 다 녕" "테스트 다 녕" 이런식으로 채팅이 쳐집니다. 그래서 https://pastebin.com/raw/MCBNWH9M 처럼 한 글자씩 나눠서 치면 90% 완성되기는 하는데 느려서 쓰는 의미가 없구요.. 클립보드는 아예 한글이 깨져서 안됩니다. 좋은 방도가 있을까요?
    답글

    • 남성 2019.03.26 13:23 신고

      일단 클립보드에서 한글이 깨지는게 이상하네요. 어떤 Autohotkey 버전을 사용하는지 모르겠는데.... 저는 Autohotkey_L unicode 32 비트 버전을 사용중입니다.

  • ㅇㅇ 2019.03.26 14:17

    아쉬운대로 한글자씩 쓰는 방법으로 최적의 시간을 찾아서 적용했습니다. 글 쓰신거는 정말 감사합니다. 많은 도움이 되었습니다.
    답글