NGMsoftware

NGMsoftware
로그인 회원가입
  • 매뉴얼
  • 팁 앤 테크
  • 매뉴얼

    팁과 테크니컬 노하우를 확인하세요.

    팁 앤 테크

    팁과 테크니컬 노하우를 확인하세요.

    본 사이트의 컨텐츠는 저작권법의 보호를 받으므로 무단 복사, 게재, 배포 등을 금합니다.

    디자이너 1부 - 엔지엠 마우스 매크로 만들기. (프레임워크와 에디터)

    페이지 정보

    본문

    안녕하세요. 엔지엠소프트웨어입니다. 파이썬으로 매크로 만드는 방법에 대해 자세하게(?) 알아봤는데요. 기능 비교를 위해~ 엔지엠으로 매크로를 어떻게 만드는지 알아볼께요. 사실 홈페이지의 내용을 잘 보면 비슷한 내용들이 많이 검색될겁니다. 하지만, 코딩 방식으로 매크로를 제작하는게 편하신 분들은 이 글을 참고하시면 많은 도움이 될겁니다. 프로그램을 하나 만드는데는 정말 많은 노력이 필요합니다. 눈에 보이지 않는 기능들이 너무나도 많기 때문이죠. 예를 들면 배포하는 형식이나 보안, 서버, 데이타베이스, 설치, 암호화, 인증, 패킹등등... 복잡합니다. 개발자라고 하더라도 어떤 서비스를 제공하는 소프트웨어를 개발하는건 쉬운게 아닙니다^^;

    ※ 엔지엠 프레임워크는 엔터프라이즈 라이센스에서 사용할 수 있습니다.

     

    엔지엠 에디터와 디자이너를 설치해줍니다. 엔지엠 에디터 설치 방법은 [ 여기 ]를 참고하세요. 디자이너는 [ 여기 ]를 참고하시면 됩니다. 마지막으로 Visual Studio를 설치해줍니다. 매뉴얼 > 학습 게시판에 있는 [ 파이썬 매크로 만들기 ]에서는 Visual Studio Code를 사용했는데요. 엔지엠 제품은 C#으로 되어 있기 때문에 다른 개발 도구(IDE, 통합 개발 환경)를 설치해야 합니다. Visual Studio는 아래 링크에서 다운로드 받을 수 있습니다. 무료 버전인 커뮤니티를 설치하고, 마이크로소프트에 회원 가입 후 로그인해야 합니다. 자~ 이제 비주얼 스튜디오를 실행하고, 엔지엠 프레임워크 라이브러리를 참조에 추가 해줍니다. 아~ 그전에 예제로 사용할 새로운 프로젝트를 만들어야 합니다.

    nq16Xnh.png

     

     

    아래 그림은 Windows Forms 앱 (.NET Framework)으로 선택되어 있는데요. 이거 말고, 3번째 콘솔 앱(.NET Framework)으로 만들어주세요. Windows Forms 앱은 GUI가 있는 프로그램을 만들 때 사용합니다. 파이썬 매크로 만들기와 동일하게 테스트하기 위해 일단은 콘솔 앱으로 진행하도록 하겠습니다. GUI는 엔지엠 디자이너로 쉽게 만들 수 있으므로 나중에 다시 알아보도록 할께요.

    ZV6XWsu.png

     

     

    예제라서 기본 값으로 놔두고, 우측 하단의 "만들기" 버튼을 클릭하세요.

    kbHdWU1.png

     

     

    여러분들도 아래와같은 화면일겁니다.

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using System.Threading.Tasks;
    
    namespace ConsoleApp1
    {
        class Program
        {
            static void Main(string[] args)
            {
            }
        }
    }

    SQDS5wa.png

     

     

    파이썬과는 다르게 C#은 기본적으로 사용되는(사용될것으로 예상되는) 참조가 포함되어 있습니다. 파이썬이나 자바는 import로 패키지 또는 모듈을 참조하고, C#은 using(유징)을 사용합니다. 언어마다 차이는 있지만, 메커니즘은 동일하기 때문에 이런 키워드들은 그냥 외워서 사용해야 합니다. 참조에서 우클릭 후 디자이너 라이브러리를 추가하세요.

    o3zp76p.gif

     

     

    엔지엠 디자이너(프레임워크 포함)는 아래 위치에 있습니다.

    • 32bit: C:\Program Files (x86)\NGMsoftware\NUI\Designer.dll
    • 64bit: C:\Program Files\NGMsoftware\NUI\Designer.dll

     

    아래와 같이 코드를 변경하고, 실행(F5) 해보세요.

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using System.Threading.Tasks;
    using Mouse = NGM.Utility.MouseKeyboardManager.MouseSimulator;
    using Keyboard = NGM.Utility.MouseKeyboardManager.KeyboardSimulator;
    
    namespace ConsoleApp1
    {
        class Program
        {
            static void Main(string[] args)
            {
                Mouse.Position = new System.Drawing.Point(200, 200);
            }
        }
    }

    KBl5SG8.gif

     

     

    파이썬의 pyautogui와 다르게 기본적으로 절대 좌표를 사용합니다. 그래서 마우스가 모니터를 기준으로 좌측 상단으로부터 X = 200, Y = 200 위치로 이동된것입니다. 상대 좌표로 이동시키려면 어떻게 해야 할까요? 마우스의 현재 위치를 알면 되겠죠? C#에서는 마우스의 위치를 알려주는 많은 함수가 존재합니다. 아래와같이 코드를 변경하고 다시 실행 해보세요.

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using System.Threading.Tasks;
    using Mouse = NGM.Utility.MouseKeyboardManager.MouseSimulator;
    using Keyboard = NGM.Utility.MouseKeyboardManager.KeyboardSimulator;
    
    namespace ConsoleApp1
    {
        class Program
        {
            static void Main(string[] args)
            {
                var p = Mouse.Position;
                p.Offset(new System.Drawing.Point(200, 200));
                Mouse.Position = p;
            }
        }
    }

    j3oDLxh.gif

     

     

    좀 더 개발자스럽게(?) 만드는 법을 알아볼까요^^ 콘솔창을 상호작용 하도록 변경하고, 동작에 대한 내용을 사용자에게 표시 해봅시다.

    #region 참조
    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using System.Threading.Tasks;
    using Mouse = NGM.Utility.MouseKeyboardManager.MouseSimulator;
    using Keyboard = NGM.Utility.MouseKeyboardManager.KeyboardSimulator;
    #endregion
    
    namespace ConsoleApp1
    {
        class Program
        {
            static void Main(string[] args)
            {
                // 시작전 지연. 0.5초 후 시작됩니다.
                System.Threading.Thread.Sleep(500);
    
                // 마우스 위치를 좌상단 200, 200으로 이동합니다.
                Mouse.Position = new System.Drawing.Point(200, 200);
                Console.WriteLine("마우스가 X=200, Y=200으로 이동되었습니다.");
    
                // 시작적으로 확인하기 위해 지연 추가.
                System.Threading.Thread.Sleep(500);
    
                // 마우스 위치를 현재 위치에서 200, 200으로 이동합니다.
                var p = Mouse.Position;
                p.Offset(new System.Drawing.Point(200, 200));
                Mouse.Position = p;
                Console.WriteLine($"마우스가 X={Mouse.Position.X}, Y={Mouse.Position.Y}으로 이동되었습니다.");
    
                // 콘솔 출력을 확인하기 위해 대기합니다. 아무키나 누르면 프로그램이 종료됩니다.
                Console.ReadLine();
            }
        }
    }

    wHoh4mg.gif

     

     

    이 예제를 통해서 우리는 마우스의 위치를 변경할 수 있게 되었습니다. 그리고, 현재 마우스의 위치값도 알 수 있죠. Mouse.Position을 통해서 말이죠^^ 아무튼 엔지엠은 기본적으로 절대 좌표를 사용합니다. 상대 좌표가 필요한 경우는 FPS 게임이나 마우스로 방향을 정하는 MMORPG 게임에서 사용할 수 있습니다. 이외에는 대부분 절대 좌표를 사용하고 있습니다. 자 그러면~ 본격적으로 내가 원하는 위치를 클릭해보죠. 일단 클릭할 위치가 어딘지 알아내야 합니다. 이걸 알아내기 위해서는 좌표를 확인해야겠죠? 이건 엔지엠 에디터를 사용해서 알아보도록 하겠습니다. 이 글을 읽고 계신분들은 이미 설치되어 있을테니까요~

    pd85FSA.gif

     

     

    바탕화면의 내문서(소심비형), 내 PC, 네트워크, 휴지통의 좌표를 알아 냈습니다.

    #region 참조
    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using System.Threading.Tasks;
    using Mouse = NGM.Utility.MouseKeyboardManager.MouseSimulator;
    using Keyboard = NGM.Utility.MouseKeyboardManager.KeyboardSimulator;
    #endregion
    
    namespace ConsoleApp1
    {
        class Program
        {
            static void Main(string[] args)
            {
                // 시작전 지연. 0.5초 후 시작됩니다.
                System.Threading.Thread.Sleep(500);
    
                Mouse.Position = new System.Drawing.Point(40, 31);
                Mouse.Click(Mouse.MouseButton.Left);
                Console.WriteLine($"내문서({Mouse.Position})를 클릭했습니다.");
    
                System.Threading.Thread.Sleep(500);
                Mouse.Position = new System.Drawing.Point(40, 110);
                Mouse.Click(Mouse.MouseButton.Left);
                Console.WriteLine($"내 PC({Mouse.Position})를 클릭했습니다.");
    
                System.Threading.Thread.Sleep(500);
                Mouse.Position = new System.Drawing.Point(40, 198);
                Mouse.Click(Mouse.MouseButton.Left);
                Console.WriteLine($"네트워크({Mouse.Position})를 클릭했습니다.");
    
                System.Threading.Thread.Sleep(500);
                Mouse.Position = new System.Drawing.Point(40, 278);
                Mouse.Click(Mouse.MouseButton.Left);
                Console.WriteLine($"휴지통({Mouse.Position})을 클릭했습니다.");
    
                // 콘솔 출력을 확인하기 위해 대기합니다. 아무키나 누르면 프로그램이 종료됩니다.
                Console.ReadLine();
            }
        }
    }

    7B3KWUl.gif

     

     

    여러분들도 위와 같이 잘 동작하죠? 항상 그렇듯이 처음에는 원칙대로 작성해보는게 좋습니다. 아래는 휴지통을 더블 클릭하는 예제입니다.

    #region 참조
    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using System.Threading.Tasks;
    using Mouse = NGM.Utility.MouseKeyboardManager.MouseSimulator;
    using Keyboard = NGM.Utility.MouseKeyboardManager.KeyboardSimulator;
    #endregion
    
    namespace ConsoleApp1
    {
        class Program
        {
            static void Main(string[] args)
            {
                // 시작전 지연. 0.5초 후 시작됩니다.
                System.Threading.Thread.Sleep(500);
    
                Mouse.Position = new System.Drawing.Point(40, 31);
                Mouse.Click(Mouse.MouseButton.Left);
                Console.WriteLine($"내문서({Mouse.Position})를 클릭했습니다.");
    
                System.Threading.Thread.Sleep(500);
                Mouse.Position = new System.Drawing.Point(40, 110);
                Mouse.Click(Mouse.MouseButton.Left);
                Console.WriteLine($"내 PC({Mouse.Position})를 클릭했습니다.");
    
                System.Threading.Thread.Sleep(500);
                Mouse.Position = new System.Drawing.Point(40, 198);
                Mouse.Click(Mouse.MouseButton.Left);
                Console.WriteLine($"네트워크({Mouse.Position})를 클릭했습니다.");
    
                System.Threading.Thread.Sleep(500);
                Mouse.Position = new System.Drawing.Point(40, 278);
                Mouse.DoubleClick(Mouse.MouseButton.Left);
                Console.WriteLine($"휴지통({Mouse.Position})을 더블클릭했습니다.");
    
                // 콘솔 출력을 확인하기 위해 대기합니다. 아무키나 누르면 프로그램이 종료됩니다.
                Console.ReadLine();
            }
        }
    }

    enFE6lW.gif

     

     

    마우스 우클릭은 간단합니다. 이미 만들어진 옵션에서 선택만하면 되니까요. 아래 코드는 휴지통을 우클릭하는 예제입니다.

    #region 참조
    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using System.Threading.Tasks;
    using Mouse = NGM.Utility.MouseKeyboardManager.MouseSimulator;
    using Keyboard = NGM.Utility.MouseKeyboardManager.KeyboardSimulator;
    #endregion
    
    namespace ConsoleApp1
    {
        class Program
        {
            static void Main(string[] args)
            {
                // 시작전 지연. 0.5초 후 시작됩니다.
                System.Threading.Thread.Sleep(500);
    
                Mouse.Position = new System.Drawing.Point(40, 31);
                Mouse.Click(Mouse.MouseButton.Left);
                Console.WriteLine($"내문서({Mouse.Position})를 클릭했습니다.");
    
                System.Threading.Thread.Sleep(500);
                Mouse.Position = new System.Drawing.Point(40, 110);
                Mouse.Click(Mouse.MouseButton.Left);
                Console.WriteLine($"내 PC({Mouse.Position})를 클릭했습니다.");
    
                System.Threading.Thread.Sleep(500);
                Mouse.Position = new System.Drawing.Point(40, 198);
                Mouse.Click(Mouse.MouseButton.Left);
                Console.WriteLine($"네트워크({Mouse.Position})를 클릭했습니다.");
    
                System.Threading.Thread.Sleep(500);
                Mouse.Position = new System.Drawing.Point(40, 278);
                Mouse.Click(Mouse.MouseButton.Right);
                Console.WriteLine($"휴지통({Mouse.Position})을 우클릭했습니다.");
    
                // 콘솔 출력을 확인하기 위해 대기합니다. 아무키나 누르면 프로그램이 종료됩니다.
                Console.ReadLine();
            }
        }
    }

    qWbuxhS.gif

     

     

    지금은 개발자스럽게(?) 작성하는 방법이었는데요. 좀 더 엔지엠스럽게(?) 작성하려면 어떻게 해야 할까요? 아래 코드를 붙여넣기 하세요. 엔지엠 에디터는 구조적인 가이드를 제공하는 프레임워크를 사용합니다. 전체적인 스레드와 각각의 스크립트들이 상호작용할 수 있도록 밸런스를 맞춰주고, 글로벌한 변수와 프로세스를 통제 가능한 방법을 제공합니다. 아래는 매인에 스크립트 하나가 포함된 예제입니다. 물론, 스크립트에는 마우스 클릭 액션이 하나 포함되어 있죠.

    #region 참조
    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using System.Threading.Tasks;
    using Mouse = NGM.Utility.MouseKeyboardManager.MouseSimulator;
    using Keyboard = NGM.Utility.MouseKeyboardManager.KeyboardSimulator;
    using System.Windows.Forms;
    using System.Drawing;
    #endregion
    
    namespace ConsoleApp1
    {
        class Program
        {
            static void Main(string[] args)
            {
                // 매크로 엔진에서 가상으로 실행할 스크립트 뷰를 생성합니다. 
                // isBackground 파라메터를 false로 명시하지 않으면 뷰를 생성하지 않고 백그라운드로 실행됩니다.
                var sv = new Designer.Component.ScriptView(new Designer.ComponentDefault.MainView(), "/Dummy.ngs");
    
                // 스크립트 뷰는 액션을 순차적으로 실행하기 위한 TreeView를 제공합니다.
                // 마우스 클릭 액션을 하나 추가합니다.
                TreeNode tn = sv.TreeView.Nodes.Add("M", "Mouse");
    
                // 트리뷰에 추가한 노드에 마우스 클릭 액션을 추가해줍니다.
                tn.Tag = new NGM.Models.Mouse.ClickModel()
                {
                    // 매크로 엔진에서 액션을 구분하는 함수키를 설정합니다.
                    FunctionKey = NGM.Definition.FunctionKey.MOUSE_CLICK,
                    // 마우스 클릭 위치를 설정합니다.
                    MousePoint = new Point(100, 100)
                };
    
                // 스크립트를 실행합니다.
                sv.Play();
    
                // 콘솔 출력을 확인하기 위해 대기합니다. 아무키나 누르면 프로그램이 종료됩니다.
                Console.ReadLine();
            }
        }
    }

    kspegWL.gif

     

     

    바탕화면의 아이콘을 순차적으로 실행하고, 엔지엠에서 제공해주는 다양한 로그를 확인하려면 아래와 같이 만들 수 있습니다.

    #region 참조
    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using System.Threading.Tasks;
    using Mouse = NGM.Utility.MouseKeyboardManager.MouseSimulator;
    using Keyboard = NGM.Utility.MouseKeyboardManager.KeyboardSimulator;
    using System.Windows.Forms;
    using System.Drawing;
    #endregion
    
    namespace ConsoleApp1
    {
        class Program
        {
            static void Main(string[] args)
            {
                // 매인뷰를 생성합니다.
                var mv = new Designer.ComponentDefault.MainView();
    
                // 모든 로그를 출력하도록 변경해줍니다.
                DisplayAllLog(mv);
    
                // 로그가 기록되면 이벤트를 발생 시킵니다.
                mv.LogReceived += Mv_LogReceived;
    
                // 매크로 엔진에서 가상으로 실행할 스크립트 뷰를 생성합니다. 
                // isBackground 파라메터를 false로 명시하지 않으면 뷰를 생성하지 않고 백그라운드로 실행됩니다.
                var sv = new Designer.Component.ScriptView(mv, "/Dummy.ngs");
    
                // 스크립트 뷰는 액션을 순차적으로 실행하기 위한 TreeView를 제공합니다.
                TreeNode tn = sv.TreeView.Nodes.Add("M", "Mouse");
    
                // 내문서를 클릭합니다.
                tn.Tag = new NGM.Models.Mouse.ClickModel() {
                    BeforeDelay = 500,
                    FunctionKey = NGM.Definition.FunctionKey.MOUSE_CLICK,
                    MousePoint = new Point(40, 30) };
    
                tn = sv.TreeView.Nodes.Add("M", "Mouse");
    
                // 내 PC를 클릭합니다.
                tn.Tag = new NGM.Models.Mouse.ClickModel() {
                    BeforeDelay = 500,
                    FunctionKey = NGM.Definition.FunctionKey.MOUSE_CLICK,
                    MousePoint = new Point(40, 110) };
    
                tn = sv.TreeView.Nodes.Add("M", "Mouse");
    
                // 네트워크를 클릭합니다.
                tn.Tag = new NGM.Models.Mouse.ClickModel() {
                    BeforeDelay = 500,
                    FunctionKey = NGM.Definition.FunctionKey.MOUSE_CLICK,
                    MousePoint = new Point(40, 200) };
    
                tn = sv.TreeView.Nodes.Add("M", "Mouse");
    
                // 휴지통을 클릭합니다.
                tn.Tag = new NGM.Models.Mouse.ClickModel() {
                    BeforeDelay = 500,
                    FunctionKey = NGM.Definition.FunctionKey.MOUSE_CLICK,
                    MousePoint = new Point(40, 280) };
    
                // 스크립트를 실행합니다.
                sv.Play();
    
                // 콘솔 출력을 확인하기 위해 대기합니다. 아무키나 누르면 프로그램이 종료됩니다.
                Console.ReadLine();
            }
    
            static void DisplayAllLog(NGM.Interface.IMainView mv)
            {
                mv.IsOutput = true;
                mv.ShowApplicationOutput = true;
                mv.ShowConditionOutput = true;
                mv.ShowDebugOutput = true;
                mv.ShowDefaultOutput = true;
                mv.ShowFunctionOutput = true;
                mv.ShowHardwareOutput = true;
                mv.ShowKeyboardOutput = true;
                mv.ShowMemoryOutput = true;
                mv.ShowMouseOutput = true;
                mv.ShowTimeOutput = true;
            }
    
            private static void Mv_LogReceived(object sender, NGM.Events.LogWriteArgs e)
            {
                Console.WriteLine(e.Message);
            }
        }
    }

    toqpJej.gif

     

     

    엔지엠에서 액션별로 로그를 출력하려면 아래 함수를 추가하면 됩니다. 물론, 중앙에서 관리하는 매인뷰가 필요합니다.

    static void DisplayAllLog(NGM.Interface.IMainView mv)
    {
        mv.IsOutput = true;
        mv.ShowApplicationOutput = true;
        mv.ShowConditionOutput = true;
        mv.ShowDebugOutput = true;
        mv.ShowDefaultOutput = true;
        mv.ShowFunctionOutput = true;
        mv.ShowHardwareOutput = true;
        mv.ShowKeyboardOutput = true;
        mv.ShowMemoryOutput = true;
        mv.ShowMouseOutput = true;
        mv.ShowTimeOutput = true;
    }

     

     

    매인뷰는 스크립트 플레이어로부터 로그를 받아야 하는데요. 이는 이벤트로 간단하게 처리가 가능합니다.

    // 매인뷰를 생성합니다.
    var mv = new Designer.ComponentDefault.MainView();
    
    // 모든 로그를 출력하도록 변경해줍니다.
    DisplayAllLog(mv);
    
    // 로그가 기록되면 이벤트를 발생 시킵니다.
    mv.LogReceived += Mv_LogReceived;

     

     

    일부 자동화 환경에서는 소프트웨어 신호를 사용할 수 없는 경우가 간혹 있습니다. 파이썬이나 기타 다른 매크로 프로그램의 한계가 이런 부분인데요. 다행스럽게도 엔지엠에는 다양한 하드웨어 신호 변환 인터페이스를 제공합니다. 그래서, 마우스나 키보드가 동작하지 않는 상황은 발생하지 않습니다. 또한, 다양한 분석 방법이나 디버깅을 통해서 빠르고 쉽게 업무를 자동화할 수 있습니다. 한단계씩 실행하면서 무언가 별도 로직을 추가할수도 있는데요. 이 부분은 키보드와 이미지, 문자판독등등을 알아보고 마지막에 테스트 해볼께요.

     

    여기까지 잘 따라하셨나요? 생각보다 쉽죠^^? 여러분들은 이제 마우스 기능을 거의 마스터 했습니다. 아직 알아보지 않은 한가지가 남았는데요. 그건 바로~!!! 스크롤(마우스 휠)입니다. 스크롤바가 있는 클라이언트에서 쉽게 테스트가 가능한데요. 현재 윈도우 바탕화면에서 스크롤할만한 프로그램이 없습니다. 그래서 건너뛰고 마무리하려는거죠. 이 부분은 직접 MouseWheel 메소드로 테스트 해보시기 바랍니다. 아마~ 이 글을 읽으시는 분들 모두가 쉽게 성공할거라 생각합니다. 그렇게 어렵지는 않으니까요. 다음에는 키보드를 제어하는 방법에 대해 알아보는 시간을 갖도록 할께요~ 궁금한 내용이 있다면 커뮤니티 > 질문과 답변 게시판에 남겨주시면 확인 후 알려드리도록 하겠습니다.

    ※ 마우스 휠은 delta값을 인자로 받습니다. 트랙을 한번 굴리면 1입니다.

     

    개발자에게 후원하기

    MGtdv7r.png

     

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

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

    감사합니다~

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

    댓글목록

    등록된 댓글이 없습니다.