본문 바로가기
이미지 매크로

C# .NET 매크로 프로그램 만들기. (홍보/마케팅 이미지 서치 반복 수행하는 방법)

by 업무자동화 2024. 6. 21.
반응형

유료 매크로 프로그램 다운로드

http://ngmsoftware.com/bbs/board.php?bo_table=product_review 

 

엔지엠소프트웨어

엔지엠 매크로는 복잡한 반복작업을 자동화할 수 있습니다. PC 게임, 모바일 게임을 최적으로 지원하며 모든 PC 프로그램 및 업무에 적용할 수 있습니다.

www.ngmsoftware.com

#매크로 #메크로 #매크로프로그램 #엔지엠소프트웨어 #엔지엠에디터 #엔지엠플레이어 #비활성매크로 #하드웨어매크로 #기계식매크로 #마우스광클릭 #키보드매크로 #이미지서치 #이미지매치 #블로그 #카페 #인스타그램 #유튜브 #소셜네트워크 #카카오톡 #텔레그램 #자동화

 

  • 엔지엠 커뮤니티 월 이용료: 4,500원, 1년 이용료: 55,000원 (전체 기능의 80프로)
  • 엔지엠 얼티밋 월 이용료: 6,500원, 1년 이용료: 77,000원 (전체 기능의 90프로)
  • 엔지엠 엔터프라이즈 월 이용료: 9,200원, 1년 이용료: 110,000원 (전체 기능 사용)

 

안녕하세요. 엔지엠소프트웨어입니다. 오늘은 간단한 내용이라서 글을 쓸까 말까 고민하다가... 그래도 기록으로 남기기 위해서 일단 시작해봅니다. 우선, 앞선 시간에 이미지 서치와 이미지 매치 기능을 개발 했었습니다. 이걸 하면서 또 이미지 체크도 필요할까를 심각하게 고민하다가 일단 제쳐두기로 했습니다.

※ 제쳐두다: 그 일은 남겨두고 다른 일부터 하다. 즉, 나중으로 미루어두다.

 

자 그러면 일단 소스부터 열고, 기존에 처리했던 곳에서 추가적으로 코딩을 해주도록 하겠습니다. 이미지 서치와 이미지 매치 액션에 아래와 같이 속성 2개를 추가 했습니다.

[LocalizedCategory("Repeat")]
[LocalizedDisplayName("CompareRepeat")]
[LocalizedDescription("CompareRepeat")]
[Browsable(true)]
[DefaultValue(1)]
public int RepeatCount { get; set; } = 1;

[LocalizedCategory("Repeat")]
[LocalizedDisplayName("CompareRepeatTerm")]
[LocalizedDescription("CompareRepeatTerm")]
[Browsable(true)]
[DefaultValue(100)]
public int RepeatInterval { get; set; } = 100;

 

일단, RepeatCount는 화면에서 이미지를 찾을 때 이미지가 출현할 때까지 반복할 횟수입니다. 그리고, 반복할 때 컴퓨터의 부하를 줄이기 위해서 반복 간격 즉, 인터벌을 어느정도 주는게 좋습니다. 안그러면, CPU에 부담을 줄 수 있습니다. 이 부분은 컴퓨터마다 다를 수 있고 로직에 따라서도 다를겁니다. 그래서, 정량적으로 어떤 값이 적절하다라고 말하기는 어렵습니다. 테스트를 통해서 적절한 값을 찾는게 중요합니다.

 

많은 분들이 정답을 물어보는데요. 이게 딱히 정해진 답이 있는건 아닙니다. 환경에 영향을 받기 때문입니다. 쉽게 예를 들면, 사람도 전부 제각각이잖아요? 살아온 환경이 다르고 부모로부터 물려받은 DNA나 가정사등등... 정말 무수히 많은 환경 변수가 존재합니다. 컴퓨터도 마찬가지입니다. 설치되어 있는 프로그램, 하드웨어 사양, 네트워크 속도등등... 그리고, 무엇보다도 각각의 디바이스마다 드라이버 버전이 다를테고,  컴퓨터 운영 체제인 윈도우의 버전과 패치, 보안, 기타 유틸리티 버전등등 너무나 다양합니다.

 

이 모든걸 테스트해서 정답을 찾아서 알려드리기란 불가능에 가깝습니다. 마이크로소프트도 수십만명의 개발자와 테스터가 있지만 완벽하지 않듯이 한계가 있다는걸 이해해야 합니다. 물론, 최대한 여러 환경에서 테스트하고 고객분들의 내용을 반영해서 패치는 하지만 물리적으로 그렇다는 이야기입니다. 항상 최적의 상태와 정답을 알려달라는 분들이 너무 많지만, 알려드릴 수 없는 이유에 대해 잠시 적어봤습니다. 알려드리기 싫어서가 아니라 모르기 때문입니다.

 

잠시 이야기가 옆으로 새어 나갔는데요. 다시 본론으로 돌아와서 이미지 조건은 Source와 Target으로 2개의 이미지를 사용합니다. Source는 캡쳐한 이미지로 윈도우 화면에서 찾을 이미지를 말합니다. Target은 윈도우 화면을 말합니다. 다시 말해서 Target 대상 이미지에서 Source 원본 이미지를 찾는 것입니다. 개발하다보면 개발자의 영어 수준에 따라서 작명이 이루어지는데요. 제 짧은 영어 실력 때문에 오해가 생길만한 작명들이 다수 존재합니다. 전체적인 맥락을 보고 이해하시면 좋을거 같습니다. ^^;

 

아래와 같이 기존 로직 위에 for 반복기를 하나 추가 해줍니다.

for (int i = 0; i < RepeatCount; i++)
{
    target = Ai.Common.Screen.Capture(this.SearchArea, player.Manager.Option.CaptureMode, player.Manager.Option.UseMultiMonitor);

    if (target != null)
    {
        Rectangle rect = Ai.Common.ConditionImage.ImageSearch(_source, target, AccuracyRate, UsedSkipTransparent, IsSearchDirectionReverse, PixelFormat);
        this.FindImageRectangleData = rect;

 

그리고, 마지막에 아래와 같이 코드를 작성 해줍니다. 우선, ConditionResult에 따라서 브레이크를 걸어줍니다. 브레이크는 반복기를 탈출할 때 사용합니다. 조건이 참이라면 계속 반복할 필요가 없습니다. 그래서, 브레이크를 걸어줘야 합니다. 그리고, 이미지 리소스는 가비지 컬렉터에서 자동으로 수집되지 않습니다. 닷넷을 하다보면 이런 것들이 존재하는데요. 마이크로소프트의 도움말을 항상 뒤져보면서 명시적으로 디스포즈(Dispose)를 호출해야 하는지 체크해야 합니다. 안그러면 메모리 누수(Memory Leak)가 발생하는 참사가 벌어집니다.

 

마지막은 반복 횟수와 반복한 횟수에서 1을 뺀 값이 같은지 비교해서 딜레이 처리를 해줘야 합니다. 너무 빠르게 동작하는 경우 컴퓨터에 부담을 주기 때문에 어느정도 CPU가 쉴 수 있는 시간을 주는게 좋습니다. 물론, 안줘도 됩니다. 컴퓨팅 파워를 극한까지 끌어 올려서 사용해도 큰 문제가 되지 않습니다. 지금은 하드웨어도 많이 발전했고 윈도우 OS도 많이 안정화가 되었기 때문입니다. 일단은 믿고 사용해야 합니다. 그래야 마음이 편하니까요. ^^;

 

이 글을 적으면서 코딩을 하다보니 이전 버전인 엔지엠 6에서 문제점? 또는 불편하거나 개선 되어야 할점이 하나 생각 났습니다. 이미지 서치나 이미지 매치에서 이미지를 찾으면 클릭할 수 있게 확장 기능이 포함되어 있는데요. 원래는 이미지 서치에서 찾은 위치를 변수에 넣고, 이 변수에 저장되어 있는 위치 값을 마우스 클릭으로 받아와서 처리해야 합니다. 하지만, 이렇게하면 이미지를 찾아서 클릭하기 위해 3개의 액션을 사용해야 하는 불편함이 있습니다. 그래서, 이미지 조건들에는 확장 기능으로 마우스 동작이 추가되어 있습니다.

 

 

자 여기서 자잘한 문제가 발생합니다. 우리가 쿠팡이나 네이버 스마트 스토어에서 상품을 검색해서 클릭한다고 가정 해봅시다. 보통 마케팅 회사나 홍보용 프로그램을 제작하는 업체들이 엔지엠 매크로를 이용하고 있는데요. 이 때 약간의 문제가 있습니다. 내 상품을 찾기 위해서 아래로 스크롤 하다가 상품 또는 샵을 발견하면 바로 클릭이 발생합니다. 이 때 스크롤이 되고 있는 중이기 때문에 위로 올라가고 있을겁니다. 이미지가 크면 약간 위치가 변경되더라도 문제가 발생하진 않지만, 이미지가 작다면 이미 스크롤 되면서 위치가 변경된 후 클릭하기 때문에 동작에 문제가 됩니다.

 

그래서, 내 상품을 찾았다면 어느정도 지연을 줘서 잠시 대기했다가 현재 위치를 다시 한번 체크한 후 클릭할 수 있도록 해주는게 좋습니다. 이렇게하면 안정적으로 처리가 가능합니다. 이전 버전에서는 이미지 처리 프로세스가 복잡하고, 클래스들이 독립적이지 못하고, 관계를 맺고 있다보니 수정에 어려움이 많았습니다. 하지만, 이번에는 새롭게 만들면서 기존의 설계/디자인 문제를 개선했기 때문에 독립적으로 처리가 가능해졌습니다.

 

이 시나리오를 재현하기가 까다로워서 테스트를 해볼수는 없을듯 합니다. 스크롤링 되면서 상품을 찾는 예제를 하나 만들어야 할거 같은데요. 나중에 웹 API와 연동해서 같이 만들어 보도록 할께요. 우선은, 아래와 같이 마우스 지연 속성을 하나 추가 했습니다.

[LocalizedCategory("Mouse")]
[LocalizedDisplayName("MouseDelayBeforeExecution")]
[LocalizedDescription("ConditionDelayBeforeExecution")]
[Browsable(true)]
[DefaultValue(0)]
public int MouseDelayBeforeExecution { get; set; }

 

반복기를 약간 수정해야 할거 같군요. 가능하면 goto는 사용하지 않는게 좋지만, 새로운 메소드를 만들 필요까지는 없을듯 해서 일단 goto로 코딩 해두었습니다.

bool isRecheck = false;
Image? target = null;

for (int i = 0; i < RepeatCount; i++)
{
Recheck:

 

나중에 지연 후 함수 호출로 변경해도 될듯 하지만, 일단은 그렇습니다. 아마도 나중에 리팩토링 대상에 포함될듯 합니다.

if (ConditionResult && UseMouse)
{
    if (MouseDelayBeforeExecution > 0 && !isRecheck)
    {
        Task.Delay(MouseDelayBeforeExecution).Wait(player.CT);
        isRecheck = true;
        goto Recheck;
    }

 

테스트는 아래 유튜브 동영상을 참고 해주세요.

https://youtu.be/_d-MWyYUbYc

 

 

[ 각종 자동화 매크로 및 RPA 프로그램 제작 해드립니다. ]

[ 초보자도 쉽게 따라할 수 있는 기초 학습 강좌 보기 ]

 

원본 글 보기

http://ngmsoftware.com/bbs/board.php?bo_table=tip_and_tech 

 

엔지엠소프트웨어

엔지엠 매크로는 복잡한 반복작업을 자동화할 수 있습니다. PC 게임, 모바일 게임을 최적으로 지원하며 모든 PC 프로그램 및 업무에 적용할 수 있습니다.

www.ngmsoftware.com

 

반응형

댓글