NGMsoftware

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

    학습


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

    페이지 정보

    본문

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

     

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

    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;
    }

     

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

     

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

    MwPrshy.png

     

     

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

     

     

    개발자에게 후원하기

    MGtdv7r.png

     

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

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

    감사합니다~

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

    댓글목록

    등록된 댓글이 없습니다.