NGMsoftware

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

    학습


    C# C# .NET Core 매크로 프로그램 만들기. (마우스 더블 클릭과 휠)

    페이지 정보

    본문

    안녕하세요. 엔지엠소프트웨어입니다. 마우스 관련 액션은 이 글이 마지막이 될듯 하네요. 마우스 관련 기능은 마우스 더블 클릭과 휠 조작만 남았는데요. 크게 어려운 부분이 없어서 2개를 묶어서 같이 설명하면 좋을듯 합니다. 우선, 마우스 더블 클릭에 대해서 알아볼께요. 마우스 더블 클릭은 마우스 클릭을 2번 하는것과 같습니다. 그렇기 때문에 아래와 같이 마우스 클릭 액션을 상속 받아서 2회 실행해주면 됩니다.

    namespace Ai.Model.Action.Mouse
    {
        [Serializable]
        public class DoubleClickModel : ClickModel
        {
            public override string? Excute(Ai.Interface.IPlayer player)
            {
                base.Execute(player);
                base.Execute(player);
                return null;
            }
        }
    }

     

    코드가 상당히 간단하죠? 마우스 클릭에서 설정해야 할 모든 옵션이 더블 클릭과 동일합니다. 따라서, 불필요하게 중복코드를 만들 필요가 없습니다. 이미 다 만들어져 있으니까요. 간단하게 테스트 해보면 아래와 같이 동작하는걸 확인할 수 있습니다.

     

     

    비활성으로 동작해도 동일합니다. 어차피 클릭을 두번하니까요.

     

     

    이번에는 약간 복잡한데요. 마우스 휠에 대해서 알아볼께요. 휠은 마우스 버튼 옵션이 없기 때문에 별도로 만들어야 합니다.

    using System.ComponentModel;
    
    namespace Ai.Model.Action.Mouse
    {
        [Serializable]
        public class WheelModel : BaseModel
        {
            [LocalizedCategory("Action")]
            [LocalizedDisplayName("Direction")]
            [LocalizedDescription("Direction")]
            [Browsable(true)]
            [DefaultValue(typeof(Ai.Definition.Direction), "Down")]
            public Ai.Definition.Direction Direction { get; set; } = Definition.Direction.Down;
    
            [LocalizedCategory("Action")]
            [LocalizedDisplayName("WheelDelta")]
            [LocalizedDescription("WheelDelta")]
            [Browsable(true)]
            [DefaultValue(0)]
            public int WheelDelta { get; set; }
    
            [LocalizedCategory("Action")]
            [LocalizedDisplayName("WheelSpeed")]
            [LocalizedDescription("WheelSpeed")]
            [Browsable(true)]
            [DefaultValue(0)]
            public int WheelSpeed { get; set; }
            public override string? Excute(Ai.Interface.IPlayer player)

     

    마우스 휠을 동작시키려면 총 3가지의 옵션이 필요합니다. 어느 방향으로 휠을 굴릴지에 대한 속성은 Direction입니다. 상하좌우로 휠을 굴릴 수 있습니다. 일반적으로 휠은 상하만 존재하는데요. 좌우 휠도 있기 때문에 방향은 총 4가지를 제공합니다. 좌우 휠 옵션을 줄 수 있는 방법은 Input API밖에 없습니다. 기본 동작은 Event이기 때문에 아래와 같이 user32 API를 연결하세요.

            [DllImport("user32.dll")]
            private static extern void mouse_event(int flags, int dX, int dY, int buttons, int extraInfo);

     

    Input은 아래와 같이 구조체를 하나 만들어서 API로 넘겨야 합니다.

    internal enum MouseFlag : uint
    {
        VERTICAL_WHEEL = 0x0800,
        HORIZONTAL_WHEEL = 0x1000
    }
    
    internal struct MOUSEINPUT
    {
        internal Int32 X;
        internal Int32 Y;
        internal UInt32 MouseData;
        internal UInt32 Flags;
        internal UInt32 Time;
        internal IntPtr ExtraInfo;
    }
    
    public void MouseWheel()
    {
        new MOUSEINPUT()
        {
            Flags = 0,
            MouseData = 1,
            X = 100,
            Y = 100
        }
    }

     

    마우스 휠 방향에 따라 아래와 같이 메소드를 콜해주는데요. 좌우로 휠을 굴리는건 비활성 API가 없습니다.

                            switch (direction)
                            {
                                case Definition.Direction.Up:
                                    Ai.Api.MouseKeyboardManager.MouseSimulator.MouseWheel(wheelDelta * 120);
                                    break;
                                case Definition.Direction.Down:
                                    Ai.Api.MouseKeyboardManager.MouseSimulator.MouseWheel(wheelDelta * -120);
                                    break;
                                case Definition.Direction.Left:
                                    break;
                                case Definition.Direction.Right:
                                    break;
                            }

     

    참고로, 델타에 120을 곱해주는건 휠 한번 굴리는 기본 값이 120이기 때문입니다. 그리고, 위로 굴릴 때는 양수 값이고 아래로 굴릴 때는 음수 값을 넘겨야 합니다. 비활성도 상하 방향으로 휠을 굴리려면 PostMessage와 SendMessage에 적절하게 값을 넘겨줘야 합니다.

    switch (direction)
    {
        case Definition.Direction.Up:
        Ai.Common.Windows.PostMessage(controlHandle.Value, Ai.Api.Options.WindowMessage.WM_MOUSEWHEEL, (wheelDelta * 120) << 16, Windows.MakeLParam(position));
        break;
        case Definition.Direction.Down:
        Ai.Common.Windows.PostMessage(controlHandle.Value, Ai.Api.Options.WindowMessage.WM_MOUSEWHEEL, (wheelDelta * 120 * -1) << 16, Windows.MakeLParam(position));
        break;
        case Definition.Direction.Left:
        break;
        case Definition.Direction.Right:
        break;
    }

     

    마우스 휠 모델의 Execute에서 InputType에 따라 적절하게 메소드를 호출해주면 되는데요. 정상적으로 동작하는지 테스트 해볼까요? 테스트에 사용할 메모장을 하나 실행하고, 아래 그림과 같이 엔터키를 100번 눌렀습니다. 그리고, 스크롤바가 중간쯤 위치하도록 위치 시켜보세요. 위 아래로 스크롤되는걸 봐야 하니까요.

    dzcTsem.png

     

     

    비활성으로 동작하는 테스트입니다. 스크롤을 위 아래로 10번 동작하게 했습니다.

     

     

    이번에는 휠 스크롤 속도를 조절해볼까요? 비활성 상태라서 마우스가 이동하지는 않습니다.

     

     

    Input으로 입력 방법을 변경하고 좌우로 동작하는지도 확인해볼께요. 좌우 스크롤은 Input밖에 안되서 다른건 테스트 해볼 수 없습니다.

     

     

    휠 조작에서 상하는 문제가 없지만, 좌우는 약간 제약이 있습니다. 좌우를 사용할일이 많지는 않지만, 필요하다면 Input 방식으로 처리해야 합니다. 관련 코드는 참고만 하시고, 디테일한 내용들은 구글에서 검색해보시면 많은 내용들이 나올겁니다. 개발하면서 테스트를 같이 하다보면 문제점을 쉽게 발견할 수 있습니다. 참고로, nuget이나 github에서 비활성 매크로로 검색하면 잘 만들어진 라이브러리들이 있어요. 보통은 이런걸 이용해서 매크로 프로그램을 만듭니다. 다음에는 키보드 관련 내용들을 모두 완성 해보도록 할께요^^

     

    개발자에게 후원하기

    MGtdv7r.png

     

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

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

    감사합니다~

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

    댓글목록

    등록된 댓글이 없습니다.