본문 바로가기
이미지 매크로

C# .NET 매크로 프로그램 만들기. (키보드 후킹 이벤트 2부)

by 업무자동화 2024. 5. 12.
반응형

유료 매크로 프로그램 다운로드

http://ngmsoftware.com/bbs/board.php?bo_table=product_review 

 

엔지엠소프트웨어

엔지엠 매크로는 복잡한 반복작업을 자동화할 수 있습니다. PC 게임, 모바일 게임을 최적으로 지원하며 모든 PC 프로그램 및 업무에 적용할 수 있습니다.

www.ngmsoftware.com

#매크로 #메크로 #매크로프로그램 #엔지엠소프트웨어 #엔지엠에디터 #엔지엠플레이어 #비활성매크로 #하드웨어매크로 #기계식매크로 #마우스광클릭 #키보드매크로 #이미지서치 #이미지매치 #블로그 #카페 #인스타그램 #유튜브 #소셜네트워크 #카카오톡 #텔레그램 #자동화

 

 

  • 엔지엠 커뮤니티 월 이용료: 4,500원, 1년 이용료: 55,000원 (전체 기능의 80프로)
  • 엔지엠 얼티밋 월 이용료: 6,500원, 1년 이용료: 77,000원 (전체 기능의 90프로)
  • 엔지엠 엔터프라이즈 월 이용료: 9,200원, 1년 이용료: 110,000원 (전체 기능 사용)

 

안녕하세요. 엔지엠소프트웨어입니다. 앞서 마우스 이벤트를 후킹해서 매크로 루틴을 어떻게 건너뛰어야 하는지 알아봤습니다. 마우스 관련 내용은 이 전글을 참고하시면 되고요. 오늘은 키보드 후킹에 대해서 개발을 시작 해볼께요. 대부분의 내용은 마우스 후킹과 비슷해서 디테일한 내용은 건너뛰고 핵심 내용과 테스트만 진행할께요.

 

키보드도 마우스와 동일하게 이벤트라서 이벤트 관련 인터페이스들은 구현해야 합니다.

public class EventStateGotoModel : ActionModel, Ai.Interface.ISelectActionId, Ai.Interface.IEvent

 

이벤트가 중복으로 처리되는걸 방지하려면 아래 속성을 처리해줘야 합니다.

[LocalizedCategory("Action")]
[LocalizedDisplayName("SuppressEvent")]
[LocalizedDescription("SuppressEvent")]
[Browsable(true)]
[DefaultValue(false)]
public bool SuppressEvent { get; set; }

 

참고로, 마우스와 키보드 후킹이 응용 프로그램 안에서만 동작한다면 문제가 안되겠지만, 이렇게 동작하는건 업무 자동화 RPA 매크로에서 의미 없는 기능입니다. 왜냐하면 후킹을 해당 프로그램에 걸기 때문에 그 프로그램 안에서만 사용할 수 있기 때문인데요. 이런 문제를 해결하기 위해서는 글로벌 후킹을 만들어서 사용해야 합니다. 글로벌 후킹은 윈도우 디바이스 장치의 인터페이스를 연결해서 개발하고 있어요.

 

그런데, 단시 인터페이스만 연결한다고 해서 처리가 가능한건 아닙니다. 이벤트 핸들러를 대리자에 위임해서 다비이스 장보를 프로그램에 넘겨줄 수 있어야 합니다. 이런 시나리오에 가장 적합한 방식이 이벤트예요. 다른 방법을 사용해도 되지만, 다른 여러개의 액션 또는 프로그램에서 후킹하도록 하려면 이 방법 말고는 없어요. 아무튼, 이렇게 키보드의 키를 후킹해놓고, 키코드까지 매핑시켜줘야 합니다.

 

키보드 상태를 설정할 수 있는 속성을 추가해줍니다.

[LocalizedCategory("Action")]
[LocalizedDisplayName("KeyboardState")]
[LocalizedDescription("KeyboardState")]
[Browsable(true)]
[DefaultValue(null)]
public Ai.Definition.keyboardState[]? KeyboardState { get; set; }

 

코드표는 아래와 같아요. 마우스에 비하면 엄청 단촐하죠^^?

public enum keyboardState
{
    Unknown = 0,
    KeyDown = 1,
    KeyUp = 2,
    KeyTyped = 3
}

 

키보드 상태가 마우스보다 간단한 반면에 키코드를 따로 빼서 처리하도록 했습니다. 마우스는 합쳐놔서 그런거고요. 동일한 방식으로 한다면, 키보드가 훨씬 더 많아질거예요.

[LocalizedCategory("Action")]
[LocalizedDisplayName("KeyCode")]
[LocalizedDescription("KeyCode")]
[Browsable(true)]
[DefaultValue(null)]
public Native.Virtual.KeyCode[]? KeyCode { get; set; }

 

키보드 코드표는 아래 링크에서 확인할 수 있습니다.

가상 키보드 코드표 ]

 

코드표를 참고해서 가상 키코드를 enum으로 정리를 해야 합니다. 아래는 몇개만 추가한거고요. 전부하면 스크롤이 너무 길어져서 일단 테스트용으로 몇개만 추가했어요.

public enum KeyboardVirtualKeyCode
{
    NONE = 0,

    /// <summary>
    /// Control-break processing
    /// </summary>
    CANCEL = 0x03,

    // 0x07 : Undefined

    /// <summary>
    /// BACKSPACE key
    /// </summary>
    BACK = 0x08,

    /// <summary>
    /// TAB key
    /// </summary>
    TAB = 0x09,

    // 0x0A - 0x0B : Reserved

    /// <summary>
    /// CLEAR key
    /// </summary>
    CLEAR = 0x0C,

 

이제 마우스와 동일하게 각각의 이벤트 핸들러를 연결하고, 내부 구현을 만들어줍니다.

private void _mouseHook_KeyPressed(object? sender, KeyboardHookEventArgs e)
{
    if (SuppressEvent)
        e.SuppressEvent = true;

    if (KeyCode.Contains(e.Data.KeyCode))
        _player.SetForceGotoId(EventID);

    if (SuppressEvent)
        e.SuppressEvent = false;
}

 

이벤트도 일단 누르기 하나만 추가 해두었습니다. 눌렀다 때는것과 타이핑이 완료된 이벤트도 만들면 좋을거 같아요. 이 부분은 다음에 디테일하게 작업할 때 추가해보도록 하고, 오늘은 키보드를 누를 때 이벤트가 발동하고 매크로의 마지막 액션으로 이동해서 완료되는것까지 해볼께요.

 

테스트는 마우스와 동일합니다. 다만, 이벤트만 키보드로 바뀌어 있습니다.

 

 

시나리오는 키보드의 W키를 누르면, 키보드 이벤트가 감지되어서 스크립트의 마지막 액션인 그룹 c로 이동하고 완료되도록 했습니다. 마우스 테스트와 동일합니다.

https://youtu.be/T_cuYmsZgp4

 

 

[ 각종 자동화 매크로 및 RPA 프로그램 제작 해드립니다. ]

[ 초보자도 쉽게 따라할 수 있는 기초 학습 강좌 보기 ]

 

원본 글 보기

http://ngmsoftware.com/bbs/board.php?bo_table=tip_and_tech 

 

엔지엠소프트웨어

엔지엠 매크로는 복잡한 반복작업을 자동화할 수 있습니다. PC 게임, 모바일 게임을 최적으로 지원하며 모든 PC 프로그램 및 업무에 적용할 수 있습니다.

www.ngmsoftware.com

 

반응형

댓글