오토핫키 영어 만 입력 - otohaski yeong-eo man iblyeog

오토핫키 영어 만 입력 - otohaski yeong-eo man iblyeog
원래의 코드
;<<엑셀에서>>
Send, ^g ;컨트롤G 누르면 엑셀의 이동 기능 호출
sleep, 100
send, C4 ;C4셀주소 입력
Send, {enter} ;이동
sleep, 100
Send, ^{g} ;블럭설정을 위해 다시 엑셀의 이동 기능 호출
sleep, 100
send, X10 ;셀주소 X10 입력
send, ^v
Send, +{enter}
영문 자판이었으면 사실 별 문제가 없는 코드다. 그런데 엑셀에서 자판이 한글로 설정되어 있는 경우에는 아래처럼 된다.
오토핫키 영어 만 입력 - otohaski yeong-eo man iblyeog

C4를 C4로 타이핑하지 못하고 한글 자판 때문에 ㅊ4로 타이핑하게 되고 그로 인해 이동 기능을 제대로 작동시키지 못하게 되는 것이다. 그래서 이걸 해결하려고 막 내가 알고 있는 걸 다 총동원 했다. 그래봤자 Send랑 Sendraw랑 Sendinput으로 바꿔가면서 사용해봤는데 안 되더라 -_-? 어라 분명히 이거 되는 거 아니었나? 근데 안 되더라.

그런데 그럴 수밖에 없는 것이.. 내가 지금 공부를 해보니까..

Send는 그냥 평범한 Send고..

Sendraw는 ^+!#같은 특수키들 (순서대로 Ctrl Shift Alt Win)을 있는 그대로 특수문자로 표시하기 위한 명령어

Sendinput은 이 명령어가 작동하는 동안에는 물리적인 타이핑을 해도 그 타이핑이 오토핫키의 타이핑에 개입하지 못한다고 한다. 아니 그럼 그렇다면 Send 명령어로 문자 입력이 이루어지는 과정에서는 물리적인 타이핑으로 오토핫키의 동작에 끼어들 수 있다는 거구나?

그래서 지금 테스트를 해보니까

만약에 !autohotkey 를 타이핑한다면

Send, {!}autohotkey             - 나열하듯 타이핑 치듯 출력됨. 촤르륵.

Sendraw, !autohotkey          - 나열하듯 타이핑 치듯 출력됨. 촤르륵.

Sendinput, {!}autohotkey      - 한방에 도장 찍히듯 뙇뙇뙇 출력됨. 촤르륵이 아니고 쾅쾅쾅. 찍는 느낌.

Sendraw는 문자열을 있는 그대로 출력하는 거라서 느낌표를 그냥 적어도 되지만 send나 sendinput의 경우에는 느낌표를 그냥 적을 경우 이를 Alt키로 인식해버리기 때문에 반드시 대괄호로 감싸줘야만 한다. 하여간 그래서 내가 저 위에 있는.. C가 ㅊ으로 출력되는 문제를 해결하기 위해서 sendraw나 sendinput을 사용해준 건 당연히 별 효과가 없을 수밖에 없었다. 그래서 거의 포기할까 하던 찰나에 한 줄기 희망이 보였으니 그것이 바로 Clipboard 명령어였다.

오토핫키 영어 만 입력 - otohaski yeong-eo man iblyeog
Send, ^g
sleep, 100
Clipboard = c4 ;셀 블록 설정 작업 시작
Send, ^v
Send, {enter}
sleep, 100
Send, ^{g}
sleep, 100
Clipboard = x10
send, ^v
Send, +{enter}
이가 없으면 잇몸이다.

직접 타이핑을 하는 게 아니라 오토핫키의 Clipboard 기능을 이용해서 가상의 클립보드에 내용을 입력한 다음 이를 Ctrl+V 붙여넣기를 이용해서 붙여넣으면 되는 문제였다. 누구인지 몰라도 정말 잔머리가 잘 돌아간다. 정말 이런 거 하나하나 배우고 해결해 나갈 때마다 맛보는 희열이라는 게 너무나도 즐겁다. 시간 가는 줄 모르겠다.

이렇게 해야 한다.

오토핫키 메크로 기능을 사용하다 보면, 텍스트 입력시 한/영 상태 때문에 외계어가 나오는 경우가 발생합니다. 외계어를 방지하기 위해서는 한/영 상태를 확인 후, 자동으로 한영 상태를 변환해주는 스크립트가 필요합니다. 구글링을 해 보니 필자 외에도 많은 분들이 같은 문제로 고민한 흔적이 보입니다. 다행스럽게도 한/영 자동 변환 스크립트는 구글링을 통해 쉽게 찾을 수 있었습니다. 스크립트와 함께 출처를 첨부합니다.

스크립트 출처

http://autohotkey.kro.kr/220797742200

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)
}
WinGetActiveTitle, ExplorerTitle

ime_status := % IME_CHECK("A")
if (ime_status = "0") {

} else {
Send, {vk15sc138}
}

"0"의 의미: 한/영 상태가 "A"
"1"의 의미: 한/영 상태가 "한"

즉,

한/영 상태가 A(영문)일 때, 아무것도 안 함
한/영 상태가 A(영문)이 아닐 때, 한영키 누름

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

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

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

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

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

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이 나옵니다.

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

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

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