컴퓨터를 사용하면서  프로그램을 열고 닫는  것은  매우 기본적인 동작입니다.


마우스로 프로그램을 종료해야 하는 경우 운영체제를 불문하고 대부분이 좌/우측 상단에 있는 엑스 표시를 눌러서 프로그램을 종료합니다.


하지만 이런 x 표시는 전체 창 중에서 굉장히 작아서 마우스로 클릭하기 불편한 경우가 많이 있습니다.


그래서 저는 오토핫키를 사용하여 프로그램 창의 아무데나를 누르면 프로그램을 종료하는 단축키를 사용하고 있습니다.


단축키는 마우스 왼쪽과 오른쪽 버튼을 동시에 누르는 것입니다.


오토핫키 코드는 다음과 같습니다.


~LButton & RButton:: MouseGetPos, , ,MouseWin WinClose, ahk_id %MouseWin% return


코드에 대해서 간단하게 설명 드리면, 마우스 위치의 프로그램 ID를  찾은 다음


해당 프로그램을 닫아 주는 것입니다.


코드가 굉장히 짧아서 쉽게 이해할 수 있을 겁니다.



탐색기의 주소를 알고 싶은 경우 탐색기에서 ALT + D 를 누른 후에 주소 값을 복사 하면 됩니다. 

Autohotkey 로 탐색기의 주소를 알고 싶은 경우에도 위의 내용을 코딩해 주면 되겠죠. 


해당 내용은 아래와 같을 겁니다. 



send, !d
sleep, 1000
send ^c

그런데 클립보드를 사용하다 보면 이상하게 주소가 저장이 안 될 때가 있습니다. 

그래서 COM 을 사용해 보기로 했습니다. 

Autohotkey 에서 COM 을 사용하여 현재 열린 탐색기의 폴더 주소를 아는 방법은 아래와 같습니다.

#NoEnv
#SingleInstance force

#a::   ; Shortcut : WIN + A
hwnd := WinExist("A")
WinGetClass class, ahk_id %hwnd%

if (class="CabinetWClass" or class="ExploreWClass")
{

for window, in ComObjCreate("Shell.Application").Windows
{
try
{
if (window.hwnd==hwnd)
{
sel := window.LocationURL

sel := RegExReplace(sel,"file:///","")
foldername := RegExReplace(sel,"/","\")
foldername := RegExReplace(foldername,"%20"," ")

Clipboard:=foldername
MsgBox,,, % foldername,1

break
}
}
}
}
return

위 코드를 실행 시킨 후에 탐색기를 연 상태에서 WIN + A 를 누르면 아래와 같이 msgbox 가 1 초간 열렸다가 꺼지고 클립보드에 폴더의 주소가 저장 됩니다.




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")


  1. 변영석 2018.12.01 14:54

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

    • 남성 2018.12.02 12:13 신고

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

  2. ㅇㅇ 2019.03.26 11:47

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

    • 남성 2019.03.26 13:23 신고

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

  3. ㅇㅇ 2019.03.26 14:17

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

+ Recent posts