NGMsoftware

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

    학습


    C# C# .NET 매크로 프로그램 만들기. (모바일 안드로이드 스마트폰에서 마우스 이펙트 보기)

    페이지 정보

    본문

    안녕하세요. 엔지엠소프트웨어입니다. 이전 시간에 비활성(PostMessage, SendMessage)에서 마우스 이펙트를 표시하는 방법과 활성(Event, Input, Arduino, ClassDD, Interception) 매크로에서 마우스 이펙트를 표시하는 방법을 코딩하고, 테스트 했습니다. 이번에는 모바일 기기(Device: 디바이스)인 안드로이드폰에서 마우스 클릭 좌표를 상대 좌표로 변환해서 표시하는 방법을 알아보도록 하겠습니다.

    Yu0Lk7j.png

     

     

    이 테스트를 진행하려면 안드로이드폰이 준비되어 있어야 합니다. 이 테스트에는 안드로이드 갤럭시 Z플립을 사용했습니다. ADB와 SCRCPY를 이용해서 PC와 연결하세요.

    wf5Rwnw.jpeg

     

     

    아래 명령으로 안드로이드폰을 컴퓨터에 표시합니다.

    scrcpy -t --window-width=360 --window-height=879 --show-touches

    bfHI6pi.jpeg

     

     

    갤럭시 Z 플립이 윈도우에 표시되었습니다.

    fUK9ojL.jpeg

     

     

    배율은 3분의 1로 줄여서 윈도우에 표시한건데요. 이렇게 배율을 조절하면 수십대의 핸드폰을 컴퓨터에 연결해서 제어할 수 있습니다. 엔지엠 매크로 에디터에서 안드로이드 폰에 연결하고, 마우스 클릭 좌표를 설정 했습니다. 마우스 좌표는 연결된 기기만큼 자동으로 조정되고, 동시에 명령을 수행합니다.

    vYiy1FL.jpeg

     

     

    오래전이긴 하지만, 안드로이드 관련 기능 개발을 다시 상기해보면 마우스 관련 기능들에 이펙트 처리는 추가되지 않았다는걸 알 수 있는데요. 이전 시간에도 활성과 비활성에만 기능을 추가 했습니다. 안드로이드폰을 매크로로 제어하는 것도 비활성에 가깝습니다만, 윈도우 API가 아니기 때문에 코딩 방식과 명령 처리가 많이 다릅니다. 우선, 마우스 처리 로직의 마지막에 아래와 같이 이펙트를 추가해줍니다.

    if (player.Manager.UseMouseEffect)
    {
        var process = Ai.Common.Windows.FindWindow(device.Model.Replace("_", "-"));
    
        if (process != IntPtr.Zero)
        {
            var location = Ai.Common.Mouse.AdbActiveMouseLocation(process, new Rectangle(DeviceLocation, new Size(0, 0)), Coordinate);
            player.Manager.ShowMouseEffect(location);
        }
        else
            player.Manager.ShowMouseEffect(Coordinate);
    }

     

    컴퓨터에 연결된 디바이스의 숫자만큼 마우스 이펙트를 처리하려면 현재 어떤 디바이스에서 처리되고 있는지를 알아야 합니다. 사실, 간단하게 처리하고 싶어서 여러가지 정보들을 검색 해봤는데요. 아쉽게도 저와 같은 사람들이 많았지만, SCRCPY에서 터치 이벤트가 트리거 되지 않는다는 글만 봤습니다. 그래서 여러가지 아이디어를 조합해서 안드로이드 디바이스의 좌표를 윈도우로 끌어내서 각각 처리하도록 했습니다.

     

    이렇게 하기 위해서는 디바이스 정보를 먼저 추출하고, 이 정보를 이용해서 디바이스가 윈도우의 어느 위치에 있는지 알아내야 합니다. 우선, 디바이스에서는 Model명을 확인할 수 있기 때문에 이 정보로 창 핸들을 얻습니다. 그리고, 창의 위치를 알아낼 수 있는데요. 이 정보와 마우스 위치를 계산하면 ADB 좌표를 윈도우의 좌표로 변환할 수 있게 됩니다.

     

    아래는 ADB 좌표를 윈도우 좌표로 변환해주는 간단한 함수입니다.

    public static System.Drawing.Point AdbActiveMouseLocation(IntPtr currentHandle, System.Drawing.Rectangle initialRect, System.Drawing.Point mousePoint)
    {
        Ai.Common.Windows.GetWindowRect(currentHandle, out System.Drawing.Rectangle currentRect);
        mousePoint.Offset(currentRect.X - initialRect.X, currentRect.Y - initialRect.Y);
        return mousePoint;
    }

     

    몇가지 테크닉이 더 필요하지만, 엔지엠 매크로 엔진에 연결되어 있어서 내용이 약간 복잡합니다. 그리고, SCRCPY뿐만 아니라 녹스나 엘디 플레이어 또는 뮤뮤, 미뮤, 블루스택등등... 상당히 많은 에뮬레이터도 존재합니다. 이런 수많은 디바이스에서 처리하기란 쉽지 앟습니다. 제조사마다 아웃풋이 다를뿐더러 통합되지 못한 환경탓에 난코딩을 유발하기 때문입니다. 그래서, 일종의 규칙을 정해야 할 필요가 있습니다. 좀 더 자세한 내용은 아래 동영상 테스트를 참고하시면 도움이 될거 같습니다.

     

     

    이 글이 도움이 되셨다면~ 커피 한잔이라도 후원 부탁드립니다^^

    개발자에게 후원하기

    MGtdv7r.png

     

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

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

    감사합니다~

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

    댓글목록

    등록된 댓글이 없습니다.