NGMsoftware

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

    학습


    C# C# .NET 매크로 프로그램 만들기. (기계식 또는 하드웨어 방식 키보드 매크로 with CDD and Interceptio…

    페이지 정보

    본문

    안녕하세요. 엔지엠소프트웨어입니다. 오늘은 하드웨어 또는 기계식이라고 부르는 방식의 매크로를 만들거예요. 이전 시간에 기계식 마우스 매크로를 만들었는데요. 기계식 매크로 방식은 총 3가지입니다. 아두이노를 이용한 시리얼 통신(Arduino Serial)과 클래스디디(CDD) 그리고, 인터셉션(Interception)입니다. 이미 마우스 기능은 다 개발했기 때문에 키보드도 직접 만들었을수도 있을거예요. 개발자분들이라면요. 프로그래머나 개발자가 아니더라도 관련 자료들을 조금만 관심있게 보신다면 아무나 다 만들 수 있을거 같긴합니다. 예제로 제공되는 프로젝트가 잘 되어 있으니까요.

     

    그렇다면, 인공지능 매크로에는 키보드에 관련된 내용을 어떻게 코딩해야 할까요? 이번 시간에 클래스디디와 인터셉션 모두 구현하는 방법에 대해서 알아보도록 하겠습니다. 일단, 키보드 관련 기능들에 모두 코드를 작성해야 합니다. 키보드 관련 액션들은 총 5개입니다.

    WTRAkHL.jpeg

     

     

    여기서 BaseModel은 키보드와 관련된 모든 액션들의 부모 클래스입니다. 나중에 키보드 카테고리에서 뭔가 전체적으로 처리해줄 일이 있다면 BaseModel로 넘기면 됩니다. 만약, 그렇지 않다면 모든 클래스의 타입을 체크해야 하기 때문에 코드량이 많아지고 복잡해지게 됩니다. 인공지능 매크로에서 각각의 액션들은 모두 BaseModel을 상속 받아서 구현해야 하는데요. 깜밖하고, 상속을 안받는다면 문제가 될수도 있으니 항상 유의해야 합니다.

     

    먼저, 텍스트 쓰기부터 코드를 작성 해볼까요? 쓰기 속도를 조절할 수 있는 맴버 변수를 하나 만들었습니다. 이 맴버는 시리얼과 인터셉션에 모두 사용됩니다.

    speed = player.Manager.ClassDDKeyboardDownUpDelay;
    if (speed < 1)
        speed = 1;

     

    디바이스 종류에 따라서 case가 나눠져 있고, 각각의 디바이스에 따라서 자신의 속도 값을 가져옵니다. 다만, 텍스트 쓰기의 경우 딜레이 없이 키보드가 눌린다면 문제가 발생할 수 있습니다. 그래서, 키보드 사이사이에 약간의 지연을 추가해줘야 합니다. 그래서, 사용자가 설정한 값이 1보다 작으면 무조건 1로 다시 셋팅하는 로직입니다.

    case Definition.DeviceInputType.Interception:
        speed = player.Manager.InterceptionKeyboardDownUpDelay;
        if (speed < 1)
            speed = 1;

     

    텍스트 쓰기는 하나의 키가 아닌 하나의 문장, 단어들의 조합인 텍스트입니다. 그렇다보니 텍스트에 한글과 영어가 혼합되어 사용될텐데요. 이걸 어떻게 키보드로 입력할지를 고민해봐야 합니다. 그리고, 한글은 자음과 모음으로 이루어진 완성형 방식으로 초성, 중성, 종성으로 이루어져 있습니다. 그래서, 하나의 완성된 글자를 초중종으로 분리해야 합니다. 이를 자소분리라고 합니다. 하지만, 한글의 한 문자도 고유의 Char 코드를 가지고 있기 때문에 소프트웨어 방식에서는 큰 문제가 되지 않습니다.

     

    하지만, 하드웨어 방식과 기계식 방식은 시스템에 캐릭터 코드를 입력하는게 아니라 물리적인 키보드와 같은 방식으로 동작하기 때문에 완성형 한글을 만들려면 분리한 자소를 다시 하나씩 타이핑해서 완성형 문자로 만들어야 합니다. 그렇기 때문에 텍스트를 시스템 Char 코드로 분해해서 이 코드가 한글인지 확인해야 합니다.

    if (Ai.Api.NativeInputManager.Native.JaSoGenerator.IsHangul(inputValue.ToString()))

     

    캐릭터 코드가 한글인지 확인하는 방법은 아래와 같습니다. 정규식을 사용하면 다양한 언어들을 체크할 수 있습니다.

    /// <summary>
    /// 텍스트가 한글인지 판단합니다.
    /// </summary>
    /// <param name="text">한글인지 판단할 텍스트입니다.</param>
    /// <returns>텍스트가 한글이면 True를 반환합니다.</returns>
    internal static bool IsHangul(string text)
    {
        return Regex.IsMatch(text, @"[ㄱ-ㅎ가-힣]");
    }

     

    윈도우 시스템 키를 하드웨어 장치에서 처리하려면 가상키로 변환 해줘야 합니다. 그냥 사용할 수는 없어요. 코드가 달라서요.

    var helper = new Helper { Value = Ai.Api.ApiHelper.VkKeyScan(s) };

     

    가상키 변환 코드는 윈도우에서 API로 제공해줍니다.

    [DllImport("user32.dll")]
    internal static extern short VkKeyScan(char ch);

     

    아래와 같이 조합키(Control, Shift, Alt)들은 Char 코드로 처리할 수 없기 때문에 별도로 작성해야 합니다.

    if ((helper.High & 1) != 0)
        player.Manager.ClassDD.key(player.Manager.ClassDD.todc((int)Ai.Api.NativeInputManager.Native.KeyboardVirtualKeyCode.SHIFT), 1);
    
    if ((helper.High & 2) != 0)
        player.Manager.ClassDD.key(player.Manager.ClassDD.todc((int)Ai.Api.NativeInputManager.Native.KeyboardVirtualKeyCode.CONTROL), 1);
    
    if ((helper.High & 4) != 0)
        player.Manager.ClassDD.key(player.Manager.ClassDD.todc((int)Ai.Api.NativeInputManager.Native.KeyboardVirtualKeyCode.ALT), 1);

     

    조합키를 처리하고, 릴리즈를 해줘야 하는데요. 릴리즈는 아래와 같이 마지막 2로 변경하면 됩니다. 이 부분은 클래스디디 공식 문서에 있는 내용입니다.

    if ((helper.Low & 1) != 0)
        player.Manager.ClassDD.key(player.Manager.ClassDD.todc((int)Ai.Api.NativeInputManager.Native.KeyboardVirtualKeyCode.SHIFT), 2);
    
    if ((helper.Low & 2) != 0)
        player.Manager.ClassDD.key(player.Manager.ClassDD.todc((int)Ai.Api.NativeInputManager.Native.KeyboardVirtualKeyCode.CONTROL), 2);
    
    if ((helper.Low & 4) != 0)
        player.Manager.ClassDD.key(player.Manager.ClassDD.todc((int)Ai.Api.NativeInputManager.Native.KeyboardVirtualKeyCode.ALT), 2);

     

    텍스트 쓰기를 완료하면 나머지들도 쉽게 만들 수 있을겁니다. 대부분 동일한 내용이지만, 예를 들어서 키보드 다운은 위의 코드에서 누르는 곳 코드만 추가하면 됩니다. 반대로 키보드에서 때는 동작은 아래쪽 코드만 추가하면 됩니다. 키보드 쓰기는 누르고 때는 동작의 연속이니까요. 

     

    이제 나머지 부분들은 직접 코딩을 해보시고, 아래는 인터셉션의 텍스트 입력 부분입니다. 여기서, 한글 체크와 자소 분리 및 캐릭터 문자의 처리는 모두 동일합니다. 인터셉션도 윈도우 시스템 키를 사용할 수 없기 때문에 동일하게 가상키를 맵핑해서 사용해야 합니다.

    var helper = new Helper { Value = Ai.Api.ApiHelper.VkKeyScan(s) };
    
    if ((helper.High & 1) != 0)
        player.Manager.Interception.SendKeyEvent(player.Manager.Interception.KeyboardDeviceID, (ushort)Ai.Api.ApiHelper.GetVirtualKey((uint)Ai.Api.NativeInputManager.Native.KeyboardVirtualKeyCode.SHIFT, (uint)Ai.Definition.MapVirtualKeyMapTypes.MAPVK_VK_TO_VSC), 1);
    
    if ((helper.High & 2) != 0)
        player.Manager.Interception.SendKeyEvent(player.Manager.Interception.KeyboardDeviceID, (ushort)Ai.Api.ApiHelper.GetVirtualKey((uint)Ai.Api.NativeInputManager.Native.KeyboardVirtualKeyCode.CONTROL, (uint)Ai.Definition.MapVirtualKeyMapTypes.MAPVK_VK_TO_VSC), 1);
    
    if ((helper.High & 4) != 0)
        player.Manager.Interception.SendKeyEvent(player.Manager.Interception.KeyboardDeviceID, (ushort)Ai.Api.ApiHelper.GetVirtualKey((uint)Ai.Api.NativeInputManager.Native.KeyboardVirtualKeyCode.ALT, (uint)Ai.Definition.MapVirtualKeyMapTypes.MAPVK_VK_TO_VSC), 1);

     

    인터셉션의 키보드 릴리즈는 클래스디디와 다르게 마지막 값이 0입니다. 디디는 누르는 행위가 1이고 때는 행위가 2인데요. 인터셉션은 1과 0입니다. 이 내용도 텍스트 쓰기, 키보드 입력, 키보드 다운과 업 모두 동일한 내용이라서 따로 작성하지는 않았습니다. 개발자분들이라면 금방 다 처리하셨을거예요.

     

    이제 완성된 기계식 키보드 매크로를 실행 해볼까요? 아래와 같이 테스트에 필요한 메모장을 하나 실행하세요.

    Qz3aiWZ.jpeg

     

     

    먼저, 클래스디디부터 테스트를 해볼께요. 아래와 같이 스크립트를 구성하고, 메모장에 텍스트를 쓰고, 윈도우 키와 R 키를 눌러서 윈도우 실행창도 띄워볼께요. 테스트에 대한 자세한 내용은 아래 동영상을 참고하셔서 따라 해보세요.

     

     

    이번에는 인터셉션으로 텍스트 쓰기를 테스트 해볼께요. 테스트 내용은 아래 동영상을 참고하시면 됩니다. 그리고, 이 테스트에서 캐리지 리턴 처리에 대해서도 확인할 수 있습니다. 일반적으로 윈도우와 리눅스의 줄바꿈 처리가 다르다보니 문제가 되는 경우들이 있습니다. 이 문제를 해결하려면 캐리지 리턴을 제거해야 합니다.

     

     

    여기까지 해서 기계식 매크로 또는 하드웨어 매크로를 제작하는 방법에 대해 모두 알아봤습니다. 시리얼 통신, 디디, 인터셉션 말고 또 다른 기계식 매크로가 존재할지도 모르겠지만, 엔지엠 매크로에서 제공하는 방식은 크게 3가지입니다. 이외에도 소프트웨어 신호까지 하면 총 7가지 정도 되겠네요. 아~ 모바일 전용 마우스와 키보드까지 하면 총 8가지방법을 제공하게 됩니다. 

     

    아직 모바일 관련해서는 제작 전이라 테스트는 하지 못했습니다. 아마도 조만간 안드로이드 모바일폰 매크로 기능도 추가할 수 있을듯 합니다. 이와 관련된 내용도 많이 기대 해주세요. 이 후에는 엑셀이나 데이타베이스와 관련된 내용을 중심으로 만들어 나가겠습니다. 감사합니다.

     

    개발자에게 후원하기

    MGtdv7r.png

     

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

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

    감사합니다~

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

    댓글목록

    등록된 댓글이 없습니다.