NGMsoftware

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

    학습


    C# 3부 - 누구나 쉽게 할 수 있는 C# 매크로 만들기. (이미지 서치, ImageSearch)

    페이지 정보

    본문

    안녕하세요. 엔지엠소프트웨어입니다. 이전 시간에 매크로 프로그래밍에서 마우스를 어떻게 클릭해야 하는지 알아봤는데요. 오늘 배워볼 내용은 이미지 서치와 마우스 클릭을 같이 해보는 예제입니다. 그렇기 때문에 마우스 클릭에 대한 내용도 알고 있어야 합니다. 아직 매크로 마우스 클릭을 안보셨다면 아래 글을 읽어보고, 내용을 학습한 후 이 글을 읽어보세요.

    [ 마우스 매크로 만들기 ]

     

    이미 만들어둔 MyPlayer 프로젝트를 불러옵니다. 그리고, 아래 동영상을 참고해서 이미지 서치 버튼을 하나 추가하세요. 버튼 이름은 이미지 서치로 했습니다.

    OBajiCs.gif

     

     

    이미지 서치에 대한 기능을 직접 구현하는건 상당히 많은양의 코드를 작성해야 합니다. [ 파이썬 매크로 만들기 ]와 동일하게 C#도 누군가가 이미 만들어놓은 멋진 모듈이 존재합니다. 90프로의 개발자는 남이 만들어놓은 코드 또는 모듈을 가져다가 사용합니다^^; 물론, 저도 그렇구요~ 아래와 같이 메뉴의 도구 > NuGet 패키지 관리자 > 솔루션용 NuGet 패키지 관리를 클릭하세요.

    qjHWaC9.png

     

     

    찾아보기 탭에서 imagefinder를 검색하세요. 이미지 서치 또는 이미지 파인더로 검색하면 많은 모듈이 나올겁니다. 괜찮은 모듈을 찾아서 사용하면 됩니다^^

    zdUQqfN.png

     

     

    ImageFinder를 선택하고, 설치를 진행하세요. 설치가 완료되면 프로젝트에 해당 모듈의 참조가 자동으로 추가되고, 사용할 수 있는 상태가 됩니다.

    WXARZVt.png

     

     

    이미지를 찾으려면 어디에서 무엇을 찾을지 설정해야 합니다. "어디에서"는 컴퓨터의 화면입니다.  "무엇을"은 컴퓨터 화면에서 찾을 어떤 그림을 말합니다. 이 예제에서는 그림판에 오랜지색 점을 하나 추가한 후 이 점을 찾아서 클릭하는 예제를 만들겁니다. 따라서, 그림판을 실행하고 오랜지색 점을 하나 찍어줘야 합니다.

    mMi4T6C.png

     

     

    화면에 오랜지색 점이 있으니 인식할 이미지를 만들어야겠죠? 엔지엠 에디터를 실행하고 아래 동영상처럼 오랜지색 점을 캡쳐해서 이미지로 만듭니다. 무료 버전 엔지엠 에디터를 설치한 후 아래와 같이 해도되지만, 별도의 캡쳐 프로그램이 있다면 그 프로그램을 사용해서 오랜지색 점만 따서 별도로 저장하면 됩니다.

    G9Df1pp.gif

     

     

    아래 그림처럼 바탕화면에 orange.png로 이미지를 저장 했습니다.

    eZ8m1rY.png

     

     

    이제 이미지 서치 이벤트에 아래와 같이 코드를 작성해줍니다.

            private void button3_Click(object sender, EventArgs e)
            {
                // 현재 모니터 화면을 이미지로 설정합니다.
                ImageFinderNS.ImageFinder.SetSource(ImageFinderNS.ImageFinder.MakeScreenshot());
    
                // 바탕화면에 찾을 이미지를 선택한 후 유사도를 설정합니다.
                // 유사도는 float값으로 1.0f로 설정 했습니다.
                var finds = ImageFinderNS.ImageFinder.Find(Image.FromFile(@"C:\Users\ngmas\Desktop\orange.png"), 1.0f);
    
                // 찾은 이미지들의 목록만큼 반복하면서 클릭해줍니다.
                foreach (var find in finds)
                {
                    // 유사도가 90프로 일치하면 클릭하도록 해줍니다.
                    if (find.Similarity > 0.9f)
                    {
                        Rectangle rect = find.Zone;
    
                        // 찾은 이미지의 중앙을 클릭하기 위해 좌표에 크기의 반을 더해줍니다.
                        Cursor.Position = new Point(rect.X + rect.Width / 2, rect.Y + rect.Height / 2);
                        mouse_event(LBUTTONDOWN, 0, 0, 0, 0);
                        mouse_event(LBUTTONUP, 0, 0, 0, 0);
                    }
                }
            }

     

    주석을 달아놓았기 때문에 ImageFinder 모듈을 사용하는데 크게 어려운점은 없을겁니다^^; 이제 프로그램을 실행한 후 오랜지색 점을 클릭하는지 볼까요?

    ozZUvPN.gif

     

     

    여러분들도 그림판의 오랜지색 점을 잘 클릭했을거예요. 엔지엠 에디터와 같은 매크로 프로그램을 사용하면 쉽게 처리할 수 있지만, 직접 코딩으로 구현하려면 여러가지 신경써줘야 할것들이 많습니다. 이미지를 캡쳐하는 프로그램부터 좌표계를 계산하는 부분까지 그렇죠. 그리고, 게임에서 이용하는 경우에는 랜덤 값을 많이 쓰는데요. 이런 것들도 코딩으로 처리해줘야 합니다. 엔지엠 매크로 에디터는 아래와 같이 간단하게 처리할 수 있습니다.

    3G3FORz.gif

     

     

    찾은 이미지에서 랜덤하게 마우스를 클릭하려면 랜덤 최대값과 최소값을 설정하기만 하면 됩니다. 최소 -100에서 최대 100까지 설정해서 그런지 이미지에서 많이 벗어난 위치도 클릭하고 있네요. 보통은 이미지 크기에 따라서 이 값도 적절하게 설정해주는게 좋습니다. 아주 작은 이미지에서 큰 랜덤 값은 해당 이미지를 클릭하지 못할수도 있으니까요~

    WyaDWVA.gif

     

     

    이렇게 C#으로 이미지 인식 매크로를 만들어봤습니다. 어느정도 로직이 들어가야 업무에 활용할 수 있겠지만, 현재로써는 이정도만 알아도 대부분의 업무용 매크로를 직접 만들어서 사용하는데 크게 어려운 부분은 없을겁니다. 이외에도 키보드 관련 내용도 준비중이니 많은 기대 부탁드리며, 오늘은 여기에서 마치도록 하겠습니다. 아래는 이 매크로의 전체 코드입니다!

    using System;
    using System.Drawing;
    using System.Runtime.InteropServices;
    using System.Windows.Forms;
    
    namespace MyPlayer
    {
        public partial class Form1 : Form
        {
            [DllImport("user32.dll")]
            static extern void mouse_event(uint dwFlags, uint dx, uint dy, uint dwData, int dwExtraInfo);
    
            const uint LBUTTONDOWN = 0x0002;    // 왼쪽 마우스 버튼 누름
            const uint LBUTTONUP = 0x0004;      // 왼쪽 마우스 버튼 땜
    
            bool isStop = true;
    
            public Form1()
            {
                InitializeComponent();
            }
    
            private void button1_Click(object sender, EventArgs e)
            {
                isStop = false;
    
                new System.Threading.Thread(new System.Threading.ThreadStart(delegate
                {
                    for (int i = 0; i < 5; i++)
                    {
                        Cursor.Position = new Point(40, 31); // 내 PC 좌표
                        mouse_event(LBUTTONDOWN, 0, 0, 0, 0);
                        mouse_event(LBUTTONUP, 0, 0, 0, 0);
    
                        if (isStop) break;
                        System.Threading.Thread.Sleep(1000);
    
                        Cursor.Position = new Point(40, 109); // 내 PC 좌표
                        mouse_event(LBUTTONDOWN, 0, 0, 0, 0);
                        mouse_event(LBUTTONUP, 0, 0, 0, 0);
    
                        if (isStop) break;
                        System.Threading.Thread.Sleep(1000);
    
                        Cursor.Position = new Point(40, 195); // 내 PC 좌표
                        mouse_event(LBUTTONDOWN, 0, 0, 0, 0);
                        mouse_event(LBUTTONUP, 0, 0, 0, 0);
    
                        if (isStop) break;
                        System.Threading.Thread.Sleep(1000);
    
                        Cursor.Position = new Point(40, 278); // 내 PC 좌표
                        mouse_event(LBUTTONDOWN, 0, 0, 0, 0);
                        mouse_event(LBUTTONUP, 0, 0, 0, 0);
    
                        if (isStop) break;
                        System.Threading.Thread.Sleep(1000);
                    }
                })).Start();
            }
    
            private void button2_Click(object sender, EventArgs e)
            {
                isStop = true;
            }
    
            private void button3_Click(object sender, EventArgs e)
            {
                // 현재 모니터 화면을 이미지로 설정합니다.
                ImageFinderNS.ImageFinder.SetSource(ImageFinderNS.ImageFinder.MakeScreenshot());
    
                // 바탕화면에 찾을 이미지를 선택한 후 유사도를 설정합니다.
                // 유사도는 float값으로 1.0f로 설정 했습니다.
                var finds = ImageFinderNS.ImageFinder.Find(Image.FromFile(@"C:\Users\ngmas\Desktop\orange.png"), 1.0f);
    
                // 찾은 이미지들의 목록만큼 반복하면서 클릭해줍니다.
                foreach (var find in finds)
                {
                    // 유사도가 90프로 일치하면 클릭하도록 해줍니다.
                    if (find.Similarity > 0.9f)
                    {
                        Rectangle rect = find.Zone;
    
                        // 찾은 이미지의 중앙을 클릭하기 위해 좌표에 크기의 반을 더해줍니다.
                        Cursor.Position = new Point(rect.X + rect.Width / 2, rect.Y + rect.Height / 2);
                        mouse_event(LBUTTONDOWN, 0, 0, 0, 0);
                        mouse_event(LBUTTONUP, 0, 0, 0, 0);
                    }
                }
            }
    
            private void button4_Click(object sender, EventArgs e)
            {
                // 창을 활성화 하기 위해 1초 기다려줍니다.
                System.Threading.Thread.Sleep(1000);
    
                // 텍스트 박스에 입력한 텍스트를 가져와서 text 변수에 저장합니다.
                string text = textBox1.Text;
    
                // 활성화된 창에 텍스트를 씁니다.
                SendKeys.Send(text);
            }
        }
    }

     

    개발자에게 후원하기

    MGtdv7r.png

     

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

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

    감사합니다~

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

    댓글목록

    등록된 댓글이 없습니다.