NGMsoftware

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

    학습


    기타 오토핫키 PostMessage와 SendMessage 사용 방법.

    페이지 정보

    본문

    안녕하세요. 엔지엠소프트웨어입니다. 오토핫키를 이용해서 비활성으로 텍스트를 입력하거나 마우스를 클릭할 때 PoseMessage와 SendMessage 명령을 사용합니다. 이 둘의 차이점은 동기 방식(SendMessage)으로 명령을 처리할지 또는 비동기 방식(PostMessage)으로 처리할지 여부입니다. 아래는 Autohotkey(오토핫키, 오핫)에서 동기 방식으로 명령을 처리하게 해줍니다.

     

    오토핫키에서 SendMessage 함수는 윈도우나 컨트롤로 메시지를 보낼 때 사용됩니다. 함수의 문법은 다음과 같습니다.

    SendMessage, Msg, wParam, lParam, Control, WinTitle, WinText, ExcludeTitle, ExcludeText
    

     

    SendMessage 함수의 인자(Arguments)는 아래와 같습니다.

    • Msg는 보낼 메시지 코드입니다.
    • wParamlParam은 선택적인 메시지 파라미터입니다.
    • Control은 메시지를 보낼 컨트롤의 이름이나 ID입니다.
    • WinTitle은 메시지를 보낼 윈도우의 제목입니다.
    • WinText는 메시지를 보낼 윈도우의 텍스트입니다.
    • ExcludeTitleExcludeText는 검색에서 제외할 윈도우나 텍스트입니다.

     

    다음은 SendMessage 함수를 사용하여 컨트롤로 메시지를 보내는 예시입니다.

    ControlSend, Edit1, Hello World!, MyWindow
    

     

    이 예시에서 Edit1은 메시지를 보낼 컨트롤의 이름이나 ID이며, Hello World!는 보낼 메시지입니다. MyWindow은 컨트롤을 포함하고 있는 윈도우의 제목입니다. 메모장에서 예제로 사용할 수 있는 AutoHotkey 스크립트는 다음과 같습니다.

    ; 메모장 열기
    Run notepad.exe
    
    ; 1초 대기
    Sleep 1000
    
    ; "Hello, World!" 입력
    SendInput Hello, World!{Enter}
    
    ; "AutoHotkey is awesome!" 입력
    SendInput AutoHotkey is awesome!{Enter}
    
    ; 메모장 닫기
    Send !{F4}

     

    이 스크립트는 메모장을 열고 1초를 기다린 다음 "Hello, World!"와 "AutoHotkey is awesome!"를 각각 입력하고, 마지막으로 메모장을 닫습니다. SendInput 함수는 키 입력이나 문자열을 보낼 때 사용됩니다. Sleep 함수는 지정된 시간(밀리초) 동안 대기합니다. Send 함수는 키보드나 마우스 이벤트를 시뮬레이트합니다. !{F4}는 Alt+F4를 뜻하며, 이는 현재 활성화된 창을 닫습니다. 이 스크립트를 실행하면 메모장에서 "Hello, World!"와 "AutoHotkey is awesome!"가 입력되고, 스크립트가 끝나면 메모장이 닫힙니다.

     

    메모장을 비활성화한 상태에서 텍스트를 입력하는 AutoHotkey 스크립트 예제는 다음과 같습니다.

    ; 메모장 열기
    Run notepad.exe
    
    ; 1초 대기
    Sleep 1000
    
    ; 메모장 창 활성화
    WinActivate, Untitled - Notepad
    
    ; "Hello, World!" 입력
    SendInput Hello, World!{Enter}
    
    ; "AutoHotkey is awesome!" 입력
    SendInput AutoHotkey is awesome!{Enter}
    
    ; 메모장 비활성화
    WinMinimize, Untitled - Notepad
    
    ; 2초 대기
    Sleep 2000
    
    ; 메모장 다시 활성화
    WinActivate, Untitled - Notepad
    
    ; "Input while minimized" 입력
    SendInput Input while minimized{Enter}
    
    ; 메모장 닫기
    Send !{F4}
    

     

    이 스크립트는 메모장을 열고 1초를 기다린 다음 메모장 창을 활성화하고 "Hello, World!"와 "AutoHotkey is awesome!"를 각각 입력합니다. 그 다음, 메모장을 비활성화하고 2초를 대기한 다음 다시 메모장을 활성화하고 "Input while minimized"를 입력합니다. 마지막으로 메모장을 닫습니다. WinActivate 함수는 지정된 윈도우를 활성화합니다. WinMinimize 함수는 지정된 윈도우를 최소화합니다. 이를 이용하여 메모장 창을 비활성화하고 활성화할 수 있습니다. Sleep 함수는 이전과 마찬가지로 지정된 시간(밀리초) 동안 대기합니다. SendInput 함수는 이전과 마찬가지로 문자열을 보냅니다. 이 스크립트를 실행하면 메모장에서 "Hello, World!", "AutoHotkey is awesome!"와 "Input while minimized"이 입력되고, 스크립트가 끝나면 메모장이 닫힙니다.

    ; 메모장 열기
    Run notepad.exe
    
    ; 1초 대기
    Sleep 1000
    
    ; 메모장 창 핸들 얻기
    WinGet, hWnd, ID, Untitled - Notepad
    
    ; "Hello, World!" 입력
    SendMessage, 0x000C, 0, Hello, World!, % "ahk_id " hWnd
    
    ; "AutoHotkey is awesome!" 입력
    SendMessage, 0x000C, 0, AutoHotkey is awesome!, % "ahk_id " hWnd
    
    ; 메모장 닫기
    Send !{F4}
    

     

    이 스크립트는 메모장을 열고 1초를 기다린 다음 메모장 창의 핸들을 얻어옵니다. 그 다음, SendMessage 함수를 사용하여 "Hello, World!"와 "AutoHotkey is awesome!"를 각각 입력합니다. 마지막으로 메모장을 닫습니다. SendMessage 함수는 지정된 윈도우 핸들과 메시지 ID를 사용하여 윈도우 프로시저에 메시지를 보냅니다. 여기서는 0x000C 메시지 ID를 사용하여 WM_SETTEXT 메시지를 보내고, lParam 매개변수로 문자열을 전달합니다. hWnd 매개변수는 메시지를 받을 윈도우의 핸들입니다. 이 스크립트를 실행하면 메모장에서 "Hello, World!"와 "AutoHotkey is awesome!"가 입력되고, 스크립트가 끝나면 메모장이 닫힙니다.

     

    엔지엠 매크로에서는 오토핫키와 동일하게 비활성으로 텍스트를 입력할 수 있습니다. 엔지엠 매크로 에디터를 실행하고 새로운 스크립트를 하나 추가하세요.

    cnOuw3h.gif

     

     

    윈도우 [ 커멘드 ] 액션을 추가한 후 아래와 같이 프로세스 이름 속성에 notepad를 입력하세요.

    9KC6WYg.png

     

     

    [ 핸들 추가 ] 액션을 스크립트에 추가하고, 컨트롤 찾기 속성에서 실행중인 메모장을 선택 해줍니다. 그리고, 메모장은 다시 닫아주세요.

    eFxMQij.png

     

     

    키보드의 [ 텍스트 쓰기 ] 액션을 추가하세요. 그리고, 비활성 모드SendMessage로 변경합니다. 메모장에 입력할 텍스트는 텍스트 속성에 적어주세요. 이 예제에서는 "안녕하세요. NGMsoftware입니다."와 같이 작성했습니다. 여러분들은 임의로 작성하셔도 됩니다^^

    t32OdBp.png

     

     

    매크로를 실행 해볼까요? 너무 순식간에 동작이 완료되므로 잘 봐야 합니다.

     

     

    이번에는 약간의 지연을 추가 해보도록 하겠습니다. 아래 동영상처럼 텍스트 쓰기 액션의 실행전 지연키보드 입력 지연에 각각 1000, 300을 입력하세요.

     

     

    이번에는 재미로~ 한가지 더 테스트 해볼께요. 위 동영상들을 보면 아시겠지만~ 실제 사람이 타이핑하는 것처럼 자음과 모음이 분리되어 타이핑 되지는 않습니다. 아직까지는 기계적인 타이핑이라서 누가봐도 소프트웨어적으로 동작하고 있다는걸 알 수 있습니다. 좀 더 사람이 하는것처럼 동작시키려면 어떻게 해야 할까요? 아래와 같이 시리얼 통신의 [ 연결 ] 액션을 추가하세요.

    ※ 시리얼 통신이란?

    시리얼 통신(Serial Communication)은 컴퓨터와 주변 장치, 혹은 두 개 이상의 장치 간에 데이터를 전송하기 위해 사용되는 통신 방식 중 하나입니다. 이 방식은 비동기적인 방식으로 데이터를 전송하며, 일련의 비트들이 시간에 따라 전송되는 방식입니다. 시리얼 통신은 다양한 통신 프로토콜을 사용할 수 있으며, RS-232, RS-485, USB, Bluetooth 등 다양한 인터페이스를 이용하여 구현될 수 있습니다. 보통은 데이터를 전송하는 장치(송신기)와 데이터를 수신하는 장치(수신기) 사이에 직렬 케이블을 연결하여 통신을 수행합니다. 시리얼 통신은 간단한 구조로 구현할 수 있으며, 데이터 전송 속도가 높은 경우에도 사용할 수 있습니다. 하지만, 통신 거리가 제한적이며 오류 검사와 같은 안정성 측면에서는 이더넷 등의 다른 통신 방식에 비해 제한적인 면이 있습니다.

     

    시리얼 통신에 사용할 COM 포트를 선택합니다. 제 경우 마우스와 키보드는 COM4입니다.

    mqCHmUC.png

     

     

    매크로를 다시 실행 해보세요. 자음과 모음이 분리되어 입력됩니다. 실제 키보드를 이용해서 타이핑하는것과 같습니다.

     

     

    위 동영상을 보시면 아시겠지만, 자음과 모음이 분리되어 입력되긴 하지만 한가지 문제점이 있습니다. 이 문제를 해결하려면 한글과 영어를 분리해서 각각 텍스트 쓰기 액션을 사용하면 됩니다. 그렇게되면 텍스트 쓰기 액션을 3개 추가하고 한글과 영어를 각각 입력해두어야 합니다. 그리고, 현재 메모장의 IME 모드를 판단해서 한영 변환키를 누르게 시켜야 합니다. 아무래도 이런 작업은 번거롭고 복잡합니다. 그래서, 텍스트 쓰기 액션의 IME 모드 감지 속성을 True로 변경해서 자동으로 처리되도록 만들어야 합니다.

     

     

    오토핫키 또는 오핫 또는 심플핫키라고 부르는 Autohotkey를 사용해도 되지만, 하드웨어 방식의 키보드 텍스트를 구현하려면 상당히 많은 코드를 작성해야 합니다. 하지만, 엔지엠 매크로를 사용하면 3개의 액션으로 기계식 매크로를 만들고 자동으로 타이핑되며 한글을 감지해서 문자를 입력할 수 있습니다. 다양한 방식으로 매크로 프로그램을 제작할 수 있긴하지만, 엔지엠 매크로만큼 다양한 입력 방식을 제공하는 솔루션은 아직까지 없습니다. 저렴한 비용으로 업무 자동화와 생산성 확대를 통해 여러분의 사업과 매출에 도움이 되었으면 좋겠습니다^^

     

    개발자에게 후원하기

    MGtdv7r.png

     

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

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

    감사합니다~

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

    댓글목록

    등록된 댓글이 없습니다.