NGMsoftware

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

    학습


    C# C# .NET 매크로 프로그램 만들기. (마우스 커서 이미지와 마우스 다운 상태를 알아내는 기능 만들기)

    페이지 정보

    본문

    안녕하세요. 엔지엠소프트웨어입니다. 게임하시는 분들이 많이 사용하는 기능중에 마우스 커서 모양을 보고, 공격이나 포탈을 클릭하는 매크로를 많이 사용하고 있습니다. 일반적으로 윈도우 환경에서는 사용할일이 많이 없는데요. 게임의 경우에는 상황에 따라서 마우스 커서 모양을 게이머가 쉽게 알 수 있도록 변경하는 것들이 많습니다. 그래서, 마우스 정보를 알아내고 어떻게 처리할 수 있는지를 알아보도록 하겠습니다.

     

    마우스 기능은 대부분 완료했는데요. 오늘 만들 마우스 정보 액션이 마지막인듯 합니다. 아래와 같이 마우스 모델 안에 MouseInfoModel을 하나 추가하세요.

    fl42C1B.png

     

     

    마우스 정보 모델은 사용자에게 제공해야 할 데이터가 총 3가지인데요. 2가지는 동적으로 바로 처리가 가능하지만, 마우스 커서 모양을 저장하는 이미지 처리는 별도로 확인할 수 있도록 해야 합니다. 이미지 리소스는 관리되지 않는 코드이기 때문에 반드시 Dispose를 호출해서 메모리에서 직접 해제해야 합니다. 그렇다보니 모델 안에 저장하면 안됩니다.

    [LocalizedCategory("Data")]
    [LocalizedDisplayName("MousePosition")]
    [LocalizedDescription("MousePosition")]
    [Browsable(true)]
    [DefaultValue(null)]
    [ReadOnly(true)]
    public Point? MouseLocation { get; set; }
    
    [LocalizedCategory("Data")]
    [LocalizedDisplayName("MouseState")]
    [LocalizedDescription("MouseState")]
    [Browsable(true)]
    [DefaultValue(typeof(Ai.Definition.MouseState), "Unknown")]
    [ReadOnly(true)]
    public Ai.Definition.MouseState MouseState { get; set; } = Definition.MouseState.Unknown;

     

    마우스 상태 정보는 아래와 같습니다.

    public enum MouseState
    {
        Unknown = 0,
        LeftDown = 1,
        RightDown = 2,
        MiddleDown = 3,
        X1Down = 4,
        X2Down = 5
    }

     

    마우스 버튼은 대부분 다 알고 계실테지만, 부연 설명을 하자면 MiddleDown은 마우스의 휠 즉 가운데 버튼을 말합니다. 일부 마우스들은 휠을 누르면 뭔가 특수한 동작을 하도록 되어 있습니다. 휠이 클릭되지 않는 마우스들도 존재하긴 하지만, 왠만한 마우스들은 가운데 버튼이 휠 역할도 하고 어떤 함수를 매핑해서 실행할 수 있는 버튼 역할도 같이 수행합니다.

     

    그리고, X1과 X2는 마우스 좌측 엄지 손가락으로 누를 수 있는 함수키들을 말합니다. 이 키들이 있는 마우스는 처리가 가능하겠지만, 대부분은 X1과 X2 버튼은 없을겁니다. 마우스 휠도 엔지엠 매크로에서는 좌우와 상하 모두 지원하지만, 대부분의 마우스들이 좌우는 지원하지 않기 때문에 확인하기가 어려울 수 있습니다. 하지만, 게임이나 좌우 스크롤이 있는 프로그램에서 실제 마우스가 아닌 매크로를 이용하면 쉽게 확인이 가능합니다.

     

    마우스 정보 액션은 마우스 커서 모양을 이미지로 저장하는 기능을 가지고 있습니다. 이 기능을 쉽게 구현하기 위해서 IImageConditionResultSave 인터페이스를 상속 받고, 구현해야 합니다.

    namespace Ai.Interface
    {
        public interface IImageConditionResultSave
        {
            string? SelectDirectory { get; set; }
    
            string? FileName { get; set; }
    
            Ai.Definition.ImageFormats ImageFormat { get; set; }
    
            bool UseSourceDrawBox { get; set; }
    
            Color SourceDrawBoxColor { get; set; }
    
            float SourceDrawBoxLine { get; set; }
    
            virtual int SourceDrawFontSize { get { return 12; } }
        }
    }

     

    마지막으로 마우스 정보를 가져오는 메소드를 만들면 코딩은 거의 마무리가 됩니다.

    public override string? Execute(Ai.Interface.IPlayer player)
    {
        MouseLocation = null;
        MouseState = MouseState.Unknown;
    
        Tuple<Image, Point>? cursor = null;
    
        cursor = Ai.Api.ApiHelper.GetCursorInfo();
    
        if (cursor == null)
        {
            player.Manager.Output.WriteLine($"{player.Manager.Client.ResxMessage.GetString("NotFoundMouseInfo")}", log4net.Core.Level.Warn);
            return null;
        }
        else
        {
            MouseLocation = cursor.Item2;
            Image img = cursor.Item1;
            MouseState = Ai.Api.ApiHelper.GetMouseState();
    
            if (!string.IsNullOrEmpty(SelectDirectory) && !string.IsNullOrEmpty(FileName))
                Ai.Common.Helper.ImageSave(this, img, new List<Rectangle>(), IsOverwrite);
        }
    
        return null;
    }

     

    마우스 정보를 가져오는 방법은 윈도우의 API를 이용해야 합니다.

    if (Core.User32.GetCursorInfo(out ci))
    {
        if (ci.flags == 0x00000001)
        {
            hicon = Core.User32.CopyIcon(ci.hCursor);
            if (Core.User32.getIconInfo(hicon, out icInfo))
            {
                var icon = Icon.FromHandle(hicon);
                var result = new Tuple<Image, System.Drawing.Point>(icon.ToBitmap(), ci.stScreenPos);
                Core.Gdi32.DeleteObject(icInfo.hbmMask);
                Core.Gdi32.DeleteObject(icInfo.hbmColor);
                Core.Gdi32.DeleteObject(ci.hCursor);
                Core.User32.DestroyIcon(hicon);
                icon?.Dispose();
                return result;
            }
        }
    }

     

    윈도우로부터 커서 정보를 요청합니다. 그리고, 마우스 커서 아이콘 이미지를 저장합니다. 이제 매크로를 실행하고, 결과를 확인 해볼까요? 아래와 같이 설정해보세요.

    kU1P6OK.png

     

     

    바탕화면에 마우스 커서 이미지를 저장하도록 했습니다. 그림판에 마우스 커서 이미지를 저장하면 아래와 같은 파일이 만들어집니다.

    lxL9BKv.jpeg

     

     

    실행 전 지연에 1초를 셋팅하고, 매크로 실행 후 바로 그림판에 마우스를 이동해야 합니다. 안그러면 기본 마우스 커서가 저장됩니다.

    YlYErek.jpeg

     

     

    아래 동영상을 참고하여 마우스 상태를 확인해보고, 조건 액션과 결합해서 로직을 만들어보세요.

     

     

    개발자에게 후원하기

    MGtdv7r.png

     

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

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

    감사합니다~

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

    댓글목록

    등록된 댓글이 없습니다.