늦었지만 강의 마무리 하도록 하겠습니다.

마지막 강의를 시작하기 전에 2강에서 댓글로 질문해주신 부분 답변드리고 시작할게요.

 

1. OpenCvSharp.OpenCVException 관련에러

- 보통 이 에러가 나는 경우는 비교대상 ScreenMat 이미지가 FindMat 보다 작아서 발생합니다.

두 이미지가 정상적인지 확인해보세요~!

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
        public void searchIMG(Bitmap screen_img, Bitmap find_img)
        {
            //스크린 이미지 선언
            using (Mat ScreenMat = OpenCvSharp.Extensions.BitmapConverter.ToMat(screen_img))
            //찾을 이미지 선언
            using (Mat FindMat = OpenCvSharp.Extensions.BitmapConverter.ToMat(find_img))
            //스크린 이미지에서 FindMat 이미지를 찾아라
            using (Mat res = ScreenMat.MatchTemplate(FindMat, TemplateMatchModes.CCoeffNormed))
            {
                //찾은 이미지의 유사도를 담을 더블형 최대 최소 값을 선언합니다.
                double minval, maxval = 0;
                //찾은 이미지의 위치를 담을 포인트형을 선업합니다.
                OpenCvSharp.Point minloc, maxloc;
                //찾은 이미지의 유사도 및 위치 값을 받습니다. 
                Cv2.MinMaxLoc(res, out minval, out maxval, out minloc, out maxloc);
                Debug.WriteLine("찾은 이미지의 유사도 : " + maxval);
 
                //이미지를 찾았을 경우 클릭이벤트를 발생!!
                if(maxval >= 0.8)
                {
                    InClick(maxloc.X, maxloc.Y);
                }
            }
        }
cs


2. 클릭 이슈

모모앱플레이어 일경우에만 확인해서 클릭이벤트를 내려주는 함수 입니다.

다른 용도로 사용하면 클릭 이벤트가 발생하지 않습니다.

오직 모모앱플레이어에서만 동작합니다.~!

다른 프로그램에서 사용하고 싶으시면 FindWindowEx 함수의 값들을 바꿔줘야 합니다.

현재에는 "RenderWindow""TheRender" 모모용으로 작성되어 있습니다.

원하시는 프로그램을 실행해서 실제 클릭값을 전달할 핸들이무엇인지 알아내야합니다.(spy++로 확인가능)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
        //x,y 값을 전달해주면 클릭이벤트를 발생합니다.
        public void InClick(int x, int y)
        {
            //클릭이벤트를 발생시킬 플레이어를 찾습니다.
            IntPtr findwindow = FindWindow(null, AppPlayerName);
            if (findwindow != IntPtr.Zero)
            {
                //플레이어를 찾았을 경우 클릭이벤트를 발생시킬 핸들을 가져옵니다.
                IntPtr hwnd_child = FindWindowEx(findwindow, IntPtr.Zero, "RenderWindow""TheRender");
                IntPtr lparam = new IntPtr(x | (y << 16));
 
                //플레이어 핸들에 클릭 이벤트를 전달합니다.
                SendMessage(hwnd_child, WM_LBUTTONDOWN, 1, lparam);
                SendMessage(hwnd_child, WM_LBUTTONUP, 0, lparam);
            }
        }
cs

 

3. 캡처 안됨 이슈

OS 별로 PrintWindow 전달 인자값을 변경해줘야합니다.

윈10일경우 0x2 이외에는 0x0 설정하고 PrintWindow 호출하시면 됩니다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
            int nFlags = 0;
 
            OperatingSystem os = Environment.OSVersion;
            Version v = os.Version;
            if (v.Major == 10){
                nFlags = 0x2;
            }
            else{
                nFlags = 0x0;
            }
 
            using (Graphics gfxBmp = Graphics.FromImage(bmp))
            {
                IntPtr hdc = gfxBmp.GetHdc();
                PrintWindow(hwnd, hdc, nFlags);
                gfxBmp.ReleaseHdc(hdc);
            }
cs


4. 찾은 이미지 클릭 위치가 안맞음

InClick 좌표값에 X좌표 + 이미지가로/2 , Y좌표 + 이미지세로/2 - 모모앱 메뉴 사이즈 를 해주면 이미지 가운데를 잘 클릭합니다.

1
2
3
4
5
6
                //이미지를 찾았을 경우 클릭이벤트를 발생!!
                int offsetY = 35;
                if(maxval >= 0.8)
                {
                    InClick(maxloc.X + FindMat.Width/2, maxloc.Y + FindMat.Height / 2 - offsetY);
                }
cs

 

자 이제 마지막 강의로는 모모앱플레이어의 사이즈가 변경이 되어도 이미지를 찾고 클릭하는 방법을 알아보도록하겠습니다.

방법부터 설명하도록 하겠습니다.

아주 간단한 방법입니다.

모모앱플레이어의 캡처된 화면을 임의로 고정된 사이즈로 변경해서 실제사이즈와 변경된 사이즈로 비율을 구하고 찾은 이미지의 좌표값에 비율을 곱해주는 방법입니다.

차근 차근 해보시면 무슨 말인지 알게 될 거에요 !!

자 먼저 모모앱플레이어가 어떤 사이즈로 설정해놔도 특정 크기로 변경할 사이즈를 정합시다.

1
2
3
4
5
6
        //모모앱플레이어 크기를 저정할 변수
        double full_width = 0;
        double full_height = 0;
        //모모앱플레이어 지정한 크기
        double pix_width = 850;
        double pix_height = 494;
cs

저는 모니터화면에서 모모앱플레이어 창크기가 전체화면에 1/4 정도되는 사이즈로 줄여서 가로세로 크기 확인 후 850 494 로 지정하였습니다.

이제 캡쳐해오는 화면을 850 494 지정한 사이즈로 변경해보겠습니다.

먼저 Form1.cs 디자인 창으로 들어가서 아래와같이 pictureBox1 사이즈를 충분히 크게 만들어주세요.

(캡처해서 사이즈 변경한 스크린샷을 보여줄거에요.)

 

button1_Click 함수로 돌아가서 28 , 29 번 줄을 추가해줍시다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
        private void button1_Click(object sender, EventArgs e)
        {
            IntPtr findwindow = FindWindow(null, AppPlayerName);
            if (findwindow != IntPtr.Zero)
            {
                //플레이어를 찾았을 경우
                Debug.WriteLine("앱플레이어 찾았습니다.");
 
                //찾은 플레이어를 바탕으로 Graphics 정보를 가져옵니다.
                Graphics Graphicsdata = Graphics.FromHwnd(findwindow);
 
                //찾은 플레이어 창 크기 및 위치를 가져옵니다. 
                Rectangle rect = Rectangle.Round(Graphicsdata.VisibleClipBounds);
 
                //플레이어 창 크기 만큼의 비트맵을 선언해줍니다.
                Bitmap bmp = new Bitmap(rect.Width, rect.Height);
 
                //비트맵을 바탕으로 그래픽스 함수로 선언해줍니다.
                using (Graphics g = Graphics.FromImage(bmp))
                {
                    //찾은 플레이어의 크기만큼 화면을 캡쳐합니다.
                    IntPtr hdc = g.GetHdc();
                    PrintWindow(findwindow, hdc, nFlags);
                    g.ReleaseHdc(hdc);
                }
 
                //캡처해온 이미지 사이즈를 변경하여 저장합니다.
                System.Drawing.Size resize = new System.Drawing.Size((int)pix_width, (int)pix_height);
                bmp = new Bitmap(bmp, resize);
 
                // pictureBox1 이미지를 표시해줍니다.
                pictureBox1.Image = bmp;
 
                searchIMG(bmp, Stone_Img);
            }
            else
            {
                //플레이어를 못찾을경우
                Debug.WriteLine("못찾았어요");
            }
        }
cs

 

우리가 원하는 사이즈로 변경이 되었는지 확인해봅시다 프로그램을 실행하고 버튼을 눌렀을 때 아래와 같이 나온다면 정상적인 상태입니다.

 

이제 찾을 이미지를 다시 저장합시다.

앞에서는 듀랑고의 돌을 찾는걸로 했는데요 이번에는 라그나로크m 에서 이미지를 찾아 저장하도록하겠습니다.

!!중요. 모모앱플레이어에서 캡처한 파일이 아닌 현재 우리가 만들고 있는 프로그램 실행해서

위에 보이는 창 스크린에서 캡처를 해주셔야합니다.

 

프로젝트 폴더 ->img 폴더 -> stone.PNG 를 저장해줬습니다.

이제는 비율을 계산해서 클릭하는 부분을 수정해보도록 합시다.

button1_Click 함수에서 현재 모모앱플레이어의 가로 세로 크기를 저장해줍시다. (16, 17 번째줄)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
        private void button1_Click(object sender, EventArgs e)
        {
            IntPtr findwindow = FindWindow(null, AppPlayerName);
            if (findwindow != IntPtr.Zero)
            {
                //플레이어를 찾았을 경우
                Debug.WriteLine("앱플레이어 찾았습니다.");
 
                //찾은 플레이어를 바탕으로 Graphics 정보를 가져옵니다.
                Graphics Graphicsdata = Graphics.FromHwnd(findwindow);
 
                //찾은 플레이어 창 크기 및 위치를 가져옵니다. 
                Rectangle rect = Rectangle.Round(Graphicsdata.VisibleClipBounds);
 
                //현재 모모앱플레이어 화면 크기를 지정해줍니다.
                full_width = rect.Width;
                full_height = rect.Height;
 
                //플레이어 창 크기 만큼의 비트맵을 선언해줍니다.
                Bitmap bmp = new Bitmap(rect.Width, rect.Height);
 
                //비트맵을 바탕으로 그래픽스 함수로 선언해줍니다.
                using (Graphics g = Graphics.FromImage(bmp))
                {
                    //찾은 플레이어의 크기만큼 화면을 캡쳐합니다.
                    IntPtr hdc = g.GetHdc();
                    PrintWindow(findwindow, hdc, nFlags);
                    g
cs

 

 

searchIMG 함수로 와서 클릭시에 좌표값을 모모앱 크기에 맞게 변환하도록 하겠습니다.

먼저 22 23 번 줄은 강의2번에서 댓글로 달아주신 부분입니다. 체크시 이미지 크기 반영하여 클릭 위치 조정했습니다.

26번줄이 우리가 임의로 지정한 사이즈 대비 현재 모모앱플레이어크기 비율을 계산하는 구간입니다.

여기서 나온 값을 실제 모모앱플레이어 화면에 적용하기 위해 곱해줍니다.(32번 줄)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
        public void searchIMG(Bitmap screen_img, Bitmap find_img)
        {
            //스크린 이미지 선언
            using (Mat ScreenMat = OpenCvSharp.Extensions.BitmapConverter.ToMat(screen_img))
            //찾을 이미지 선언
            using (Mat FindMat = OpenCvSharp.Extensions.BitmapConverter.ToMat(find_img))
            //스크린 이미지에서 FindMat 이미지를 찾아라
            using (Mat res = ScreenMat.MatchTemplate(FindMat, TemplateMatchModes.CCoeffNormed))
            {
                //찾은 이미지의 유사도를 담을 더블형 최대 최소 값을 선언합니다.
                double minval, maxval = 0;
                //찾은 이미지의 위치를 담을 포인트형을 선업합니다.
                OpenCvSharp.Point minloc, maxloc;
                //찾은 이미지의 유사도 및 위치 값을 받습니다. 
                Cv2.MinMaxLoc(res, out minval, out maxval, out minloc, out maxloc);
                Debug.WriteLine("찾은 이미지의 유사도 : " + maxval);
 
                //이미지를 찾았을 경우 클릭이벤트를 발생!!
                int offsetY = 35;
 
                //찾은 이미지를 클릭할 x,y 좌표값
                int click_x = maxloc.X + FindMat.Width / 2;
                int click_y = maxloc.Y + FindMat.Height / 2 - offsetY;
 
                //임의로 줄인 캡처화면 실제 모모앱플레이어화면 비율 계산
                double change_size = full_width / pix_width;
 
                if (maxval >= 0.8)
                {
                    //클릭할 위치에 비율만큼 곱해서 실제 모모앱플레이어 크기에 맞게 좌표값 변환 후 클릭
                    InClick((int)(click_x * change_size), (int)(click_y * change_size));
                }
            }
        }
cs

자 실행해보도록 하죠.

 

클릭하는 크기가 정확하지는 않습니다. 아무래도 비율로 계산하다보니 오차가 조금 있습니다. 참고부탁드릴게요.~!

 

이 블로그가 도움이 되었다면, 후원을 부탁드립니다
http://yc0345.tistory.com/218

210727

자 저번 강의에서는 앱플레이어를 찾아서 캡쳐하는 것 까지 진행했었습니다.

 

이번에는 원하는 이미지를 찾아서 클릭하는 것 까지 해보도록 하겠습니다.

먼저 프로젝트 폴더 bin>Debug 폴더에서 "img" 란 폴더를 하나 만들어주세요.

 

자 그리고 img 폴더에 찾을 이미지를 저장해주십시다.

 

저는 듀랑고에 돌맹이를 찾고 클릭할 예정입니다.

윈도우 기본 앱인 캡쳐 도구를 이용해서 간단하게 원하는 이미지를 아래와 같이 저장해주세요.

 

캡처도구에서

1. 새로만들기 클릭

2. 돌맹이 모양 캡쳐하기.

3. "stone" 이름으로 저장하기

 

아래와 같이 찾을 돌맹이를 하나 저장해놨습니다.

 

!!!중요!!!!

캡쳐 후에는 앱플레이어 사이즈를 변경하지 말아주세요~! 이 다음 강의때 사이즈를 변경해도 동작하는 부분 진행하도록하겠습니다.

 

위에 저장한 stone 이미지를 프로젝트 상에 불러와 보겠습니다.

 

1
2
3
4
5
6
7
8
        String AppPlayerName = "[MOMO]앱플레이어";
        Bitmap Stone_Img = null;
 
        public Form1()
        {
            InitializeComponent();
            Stone_Img = new Bitmap(@"img\stone.PNG");
        }
cs

 

2번째 줄 처럼 비트맵 을 하나 선언해주세요.

7번째 줄 처럼 img폴더에 stone 이미지를 불러와 주세요.

 

이제 플레이어 게임화면에 해당 stone 이미지를 찾아보겠습니다.

searchIMG 함수를 만들어봅시다. 해당 함수는 비트맵 이미지 두개를 받습니다.

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
        //searchIMG에 스크린 이미지와 찾을 이미지를 넣어줄거에요
        public void searchIMG(Bitmap screen_img, Bitmap find_img)
        {
            //스크린 이미지 선언
            using (Mat ScreenMat = OpenCvSharp.Extensions.BitmapConverter.ToMat(screen_img))
            //찾을 이미지 선언
            using (Mat FindMat = OpenCvSharp.Extensions.BitmapConverter.ToMat(find_img))
            //스크린 이미지에서 FindMat 이미지를 찾아라
            using (Mat res = ScreenMat.MatchTemplate(FindMat, TemplateMatchModes.CCoeffNormed))
            {
                //찾은 이미지의 유사도를 담을 더블형 최대 최소 값을 선언합니다.
                double minval, maxval = 0;
                //찾은 이미지의 위치를 담을 포인트형을 선업합니다.
                OpenCvSharp.Point minloc, maxloc;
                //찾은 이미지의 유사도 및 위치 값을 받습니다. 
                Cv2.MinMaxLoc(res, out minval, out maxval, out minloc, out maxloc);
                Debug.WriteLine("찾은 이미지의 유사도 : " + maxval);
            }
        }
cs

 

코드설명은 위 주석 참고 부탁드릴게요.

 

자 maxval 값이 0.7~1 사이 값이 나온다면 유사한 이미지를 찾았다고 생각하면됩니다.

찾은 이미지를 클릭해보도록 합시다.

 

우리는 찾은이미지 위치를 maxloc 변수에 저장하고 있습니다.

마우스 이벤트만 발생시키면 됩니다.

 

마우스 이벤트를 발생시키기 위해서 아래 9.10,12,13,15,16 줄을 추가하였습니다.

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
    public partial class Form1 : Form
    {
        [System.Runtime.InteropServices.DllImport("User32", EntryPoint = "FindWindow")]
        private static extern IntPtr FindWindow(string lpClassName, string lpWindowName);
 
        [System.Runtime.InteropServices.DllImport("user32.dll")]
        internal static extern bool PrintWindow(IntPtr hWnd, IntPtr hdcBlt, int nFlags);
 
        [System.Runtime.InteropServices.DllImport("user32.dll")]
        public static extern int SendMessage(IntPtr hwnd, int wMsg, int wParam, IntPtr lParam);
 
        [System.Runtime.InteropServices.DllImport("User32.dll")]
        public static extern IntPtr FindWindowEx(IntPtr Parent, IntPtr Child, string lpszClass, string lpszWindows);
 
        public const int WM_LBUTTONDOWN = 0x201;
        public const int WM_LBUTTONUP = 0x202;
cs

 

아래 함수가 마우스 이벤트를 발생시키는 함수입니다.

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
        //x,y 값을 전달해주면 클릭이벤트를 발생합니다.
        public void InClick(int x, int y)
        {
            //클릭이벤트를 발생시킬 플레이어를 찾습니다.
            IntPtr findwindow = FindWindow(null, AppPlayerName);
            if (findwindow != IntPtr.Zero)
            {
                //플레이어를 찾았을 경우 클릭이벤트를 발생시킬 핸들을 가져옵니다.
                IntPtr hwnd_child = FindWindowEx(findwindow, IntPtr.Zero, "RenderWindow""TheRender");
                IntPtr lparam = new IntPtr(x | (y << 16));
 
                //플레이어 핸들에 클릭 이벤트를 전달합니다.
                SendMessage(hwnd_child, WM_LBUTTONDOWN, 1, lparam);
                SendMessage(hwnd_child, WM_LBUTTONUP, 0, lparam);
            }
        }
cs

 

 

button1_Click 함수에 stone 이미지를 찾는 함수를 선언해주세요. 아래코드 30번째 줄입니다.

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
        private void button1_Click(object sender, EventArgs e)
        {
            IntPtr findwindow = FindWindow(null, AppPlayerName);
            if (findwindow != IntPtr.Zero)
            {
                //플레이어를 찾았을 경우
                Debug.WriteLine("앱플레이어 찾았습니다.");
 
                //찾은 플레이어를 바탕으로 Graphics 정보를 가져옵니다.
                Graphics Graphicsdata = Graphics.FromHwnd(findwindow);
 
                //찾은 플레이어 창 크기 및 위치를 가져옵니다. 
                Rectangle rect = Rectangle.Round(Graphicsdata.VisibleClipBounds);
 
                //플레이어 창 크기 만큼의 비트맵을 선언해줍니다.
                Bitmap bmp = new Bitmap(rect.Width, rect.Height);
 
                //비트맵을 바탕으로 그래픽스 함수로 선언해줍니다.
                using (Graphics g = Graphics.FromImage(bmp))
                {
                    //찾은 플레이어의 크기만큼 화면을 캡쳐합니다.
                    IntPtr hdc = g.GetHdc();
                    PrintWindow(findwindow, hdc, 0x2);
                    g.ReleaseHdc(hdc);
                }
 
                // pictureBox1 이미지를 표시해줍니다.
                pictureBox1.Image = bmp;
 
                searchIMG(bmp, Stone_Img);
            }
cs

 

이제 다시 searchIMG 함수로 돌아와 maxval 0.8 이상일 경우 이미지를 찾았다로 판단하여 클릭해보도록 하겠습니다.

아래 코드 20~23 번 줄 추가했습니다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
        //searchIMG에 스크린 이미지와 찾을 이미지를 넣어줄거에요
        public void searchIMG(Bitmap screen_img, Bitmap find_img)
        {
            //스크린 이미지 선언
            using (Mat ScreenMat = OpenCvSharp.Extensions.BitmapConverter.ToMat(screen_img))
            //찾을 이미지 선언
            using (Mat FindMat = OpenCvSharp.Extensions.BitmapConverter.ToMat(find_img))
            //스크린 이미지에서 FindMat 이미지를 찾아라
            using (Mat res = ScreenMat.MatchTemplate(FindMat, TemplateMatchModes.CCoeffNormed))
            {
                //찾은 이미지의 유사도를 담을 더블형 최대 최소 값을 선언합니다.
                double minval, maxval = 0;
                //찾은 이미지의 위치를 담을 포인트형을 선업합니다.
                OpenCvSharp.Point minloc, maxloc;
                //찾은 이미지의 유사도 및 위치 값을 받습니다. 
                Cv2.MinMaxLoc(res, out minval, out maxval, out minloc, out maxloc);
                Debug.WriteLine("찾은 이미지의 유사도 : " + maxval);
 
                //이미지를 찾았을 경우 클릭이벤트를 발생!!
                if(maxval >= 0.8)
                {
                    InClick(maxloc.X, maxloc.Y);
                }
            }
        }
cs

 

이제 이미지를 찾고 클릭까지 완료되었습니다.

실제 실행되는 모습을 보도록 하죠!

 

 

#

이 블로그가 도움이 되었다면, 후원을 부탁드립니다
http://yc0345.tistory.com/218

우리가 할게 앱플레이어 게임화면을 캡쳐해서 특정 이미지를 찾아 가는 것이니

1강에서는 앱플레이어를 찾아서 캡쳐하는 것 까지 진행하도록 하겠습니다.~!

 

앱플레이어를 찾기 위해서는 User32 FindWindow API를 사용해야 합니다.

해당 API는 DllImport 선언만 해주면 쉽게 사용할수 있습니다.

단순히 내 프로젝트에서 해당 api 를 사용할것이니 프로젝트 내로 포함되어라 정도로 이해해주시면 됩니다.

 

1
2
3
4
5
6
7
8
9
10
    public partial class Form1 : Form
    {
        [System.Runtime.InteropServices.DllImport("User32", EntryPoint = "FindWindow")]
        private static extern IntPtr FindWindow(string lpClassName, string lpWindowName);
 
        public Form1()
        {
            InitializeComponent();
        }
 
cs

 

해당 위치에 FindWindow 함수를 추가해주세요. 3,4 번줄 입니다.

이제 가져올 앱플레이어 이름을 지정해줍시다.

Ctrl+Shift+ESC 키를 누르면 윈도우 작업관리자가 나옵니다. 거기서 MOMO PLAYER 를 찾습니다.

 

우리가 사용할 앱플레이어 이름은 "[MOMO]앱플레이어" 입니다.

 

1
2
3
4
5
6
7
8
9
10
11
12
    public partial class Form1 : Form
    {
        [System.Runtime.InteropServices.DllImport("User32", EntryPoint = "FindWindow")]
        private static extern IntPtr FindWindow(string lpClassName, string lpWindowName);
 
        String AppPlayerName = "[MOMO]앱플레이어";
 
        public Form1()
        {
            InitializeComponent();
        }
 
cs

 

소스코드에 해당 이름을 선언해주도록 합시다. 6번 줄입니다.

 

실제 캡쳐하기 전에 Form1 에 버튼과 픽쳐박스 하나씩 추가하도록 하겠습니다.

Form1.cs [디자인] 탭에 들어가주세요.

그리고 아래 Button , PictureBox 를 드래그 해서 Form1 창안에 놔주세요.

 

 

 

button1 을 더블클릭하게 되면 다시 소스코드로 돌아가게 되고 button1_Click 함수가 생기게 됩니다.~!

button1 버튼을 누를 경우 해당 함수가 호출되어 동작하게 됩니다.

 

자 이제 button1 을 누르면

위에서 추가한 FindWindow 로 앱플이어를 찾아서 PictureBox 에 캡쳐한 화면을 표시해보도록 하겠습니다.

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
        private void button1_Click(object sender, EventArgs e)
        {
            IntPtr findwindow = FindWindow(null, AppPlayerName);
            if (findwindow != IntPtr.Zero)
            {
                //플레이어를 찾았을 경우
                Debug.WriteLine("앱플레이어 찾았습니다.");
            }
            else
            {
                //플레이어를 못찾을경우
                Debug.WriteLine("못찾았어요");
            }
        }
cs

 

자 위에서 3번째 줄을 보게 되면 AppPlayerName을 가진 프로그램을 FindWindow 찾아라를 실행하고 있는 부분입니다.

 

4번째 줄 if 문이 해당 프로그램을 찾았을 경우와

9번째줄 못찾았을 경우를 if문으로 분기하고 있습니다.

 

F5를 눌러서 빌드를 하고 버튼을 눌렀을때 정상적으로 찾았다면

 

 

위와 같이 출력 화면에 "앱플레이어 찾았습니다." 가 나옵니다.

 

자 여기까지 진행하셨으면 이제 찾은 앱플레이어를 캡쳐해보도록 하겠습니다.

 

FindWindow 와 마찬가지로 PrintWindow 를 추가해주도록 하겠습니다.

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
    public partial class Form1 : Form
    {
        [System.Runtime.InteropServices.DllImport("User32", EntryPoint = "FindWindow")]
        private static extern IntPtr FindWindow(string lpClassName, string lpWindowName);
 
        [System.Runtime.InteropServices.DllImport("user32.dll")]
        internal static extern bool PrintWindow(IntPtr hWnd, IntPtr hdcBlt, int nFlags);
 
        String AppPlayerName = "[MOMO]앱플레이어";
 
        public Form1()
        {
            InitializeComponent();
        }
cs

 

6,7 번 줄을 추가 해주었습니다. 자 이제 캡쳐할 함수도 불러왔으니 켭쳐해보도록 하죠

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
        private void button1_Click(object sender, EventArgs e)
        {
            IntPtr findwindow = FindWindow(null, AppPlayerName);
            if (findwindow != IntPtr.Zero)
            {
                //플레이어를 찾았을 경우
                Debug.WriteLine("앱플레이어 찾았습니다.");
 
                //찾은 플레이어를 바탕으로 Graphics 정보를 가져옵니다.
                Graphics Graphicsdata = Graphics.FromHwnd(findwindow);
 
                //찾은 플레이어 창 크기 및 위치를 가져옵니다. 
                Rectangle rect = Rectangle.Round(Graphicsdata.VisibleClipBounds);
 
                //플레이어 창 크기 만큼의 비트맵을 선언해줍니다.
                Bitmap bmp = new Bitmap(rect.Width, rect.Height);
 
                //비트맵을 바탕으로 그래픽스 함수로 선언해줍니다.
                using (Graphics g = Graphics.FromImage(bmp))
                {
                    //찾은 플레이어의 크기만큼 화면을 캡쳐합니다.
                    IntPtr hdc = g.GetHdc();
                    PrintWindow(findwindow, hdc, 0x2);
                    g.ReleaseHdc(hdc);
                }
 
                // pictureBox1 이미지를 표시해줍니다.
                pictureBox1.Image = bmp;
            }
            else
            {
                //플레이어를 못찾을경우
                Debug.WriteLine("못찾았어요");
            }
        }
cs

 

주석으로 설명을 달아놨습니다.

 

이제 캡쳐화면이 정상적으로 나타나는 지 확인해보도록 하죠~!

F5 -> button 클릭~!

 

 

위와 같이 화면이 잘 나오나요?

 

다음 강의에서는 원하는 이미지를 찾는거까지 진행하겠습니다.~!

 

 

#

이 블로그가 도움이 되었다면, 후원을 부탁드립니다
http://yc0345.tistory.com/218

게임상의 이미지를 가져와 원하는 이미지를 서칭 후 해당 부분을 클릭하는 것 까지 진행하려고 합니다.

 

해당 강의는 초보자를 위한 부분으로 C#을 조금이라도 아시는 분들은 스킵하셔도 됩니다.

1강부터 OpenCv MatchTemplate 함수를 이용한 이미지 서칭을 진행하겠습니다.

 

--------------------------------------------------------------------------------

 

먼저 Visual Studio C# 을 설치해주세요.

설치가 완료 된 분들은 새프로젝트를 만들어주세요~!

 

 

Durang 이라는 프로젝트 이름으로 지정하고 확인을 눌러주세요.

 

 

위와 같이 나오면 기본 준비는 완료 된 상태입니다.~!

 

이번 강의에서 가장 중요한 OpenCv 를 설치해보도록 하겠습니다.

솔루션 탐색기 아래 위치에서 오른쪽 마우스 클릭 -> NuGet 패키지 관리로 들어가주세요.

 

Nuget 패키지 관리 메뉴에 들어오면 아래 창을 볼수 있습니다.

찾아보기 탭에서 opencv 로 검색을 진행합니다.

 

검색된 목록 중에 위에 노란색으로 줄을 친 항목을 선택하고 설치하시면 됩니다.

 

 

 

설치가 완료 됐으면 이제 실제 우리 프로젝트에서 해당 openCV 가 정상적으로 설치 됐는지 확인해보도록 하겠습니다.

 

Form1.cs [디자인] 탭으로 클릭 해주고 F7 키나 Form1.cs 에서 오른쪽 마우스 코드보기를 클릭해주세요.

 

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using OpenCvSharp;
 
namespace Durang
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }
    }
}
cs

해당 코드에서 using OpenCvSharp; 를 추가해주세요. 

앞으로 이 프로젝트에서 해당 라이브러리를 사용하겠다 정도로 이해 하시면 됩니다. 

 

 

 

이제 F5 키나 시작 버튼을 눌러서 정상적으로 빌드가 되는지 확인해주세요.

위와같이 Form1 이 나오면 OpevCV 라이브러리를 사용할 준비가 완료 된 상태입니다.

 

#

이 블로그가 도움이 되었다면, 후원을 부탁드립니다
http://yc0345.tistory.com/218

180209

 

# 강좌 내용 요약

 

1. OpenCV 를 통한 이미지 서칭

2. 플레이 해상도 변화에 따른 X,Y 좌표 보정 후 마우스 이벤트 발생시키기

 

위와 같이 2개의 강좌로 진행할 예정입니다.

 

먼저,

듀랑고 매크로 강좌에서 제작할 예제 완성파일 먼저 공개합니다.

 

모모앱플레이어 해상도 설정은 아래와 같습니다.

 

 

전체화면으로 할경우 아래와 같이 공백부분이 생길수 있습니다.

오른쪽 화면처럼 공백이 안생기도록 해주세요~

 

 

 

모모앱플레이어 기준으로 제작 된 예제파일입니다.

 

durango0209.vol1.egg

durango0209.vol2.egg

 

위 두 파일 모두 받은 후 압축을 풀어주세요( 알집으로 푸셔야 합니다.!! )

 

 

1. DuMacro.exe 파일을 실행

 

2. 해당 위치에 앱플레이어 이름을 넣어 줍니다.

 

 

 

3. 원하는 항목이 있는 필드로 가서 채집하고자 하는 메뉴를 선택

 

 

4. 채집 시작을 눌러줍니다. 그럼 채집을 시작합니다.

# 추가 제작 반복 메뉴

실뽑기나 반복이 필요한 메뉴 제작 후 아래와 같이 반복 아이콘이 나와 있는 상태에서 제작반복 버튼을 눌러주면

아래 위치 클릭 및 제작버튼 누르는 동작을 반복한다.

 

 

강좌용으로 제작된 예제파일입니다. 무단 배포 금지하고 있으며 실제 게임에 이용시 게임이용에 제한을 받습니다.

이 블로그가 도움이 되었다면, 후원을 부탁드립니다
http://yc0345.tistory.com/218

듀랑고 게임오픈했습니다.

 

매크로가 필요한 게임인가요??

 

댓글에 혹시 필요한 기능이 있다면 달아주세요

 

공부용으로 개발해보겠습니다.~! 

 

 

현재는 간단하게 이미지 써칭해서 클릭 반복하기를 만들고 있습니다.~

+ Recent posts