NGMsoftware

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

    학습


    C# C# .NET 매크로 프로그램 만들기. (프로그램 제어 액션에서 프로그램 격자 배치하는 방법)

    페이지 정보

    본문

    안녕하세요. 엔지엠소프트웨어입니다. 앞서 프로그램 제어 기능을 개발했었는데요. 다클라 매크로 프로그램을 사용하시는 분들을 위해서 몇가지 기능을 추가해봤습니다. 다클라 매크로 환경에서는 대부분 모니터링 프로그램을 사용하고 있을겁니다. 이 프로그램들은 원격이라서 화면을 축소하고 확대하는데 크게 제약이 없습니다. 하지만, 컴퓨터에서 매크로가 실행되는 환경에서는 창 크기를 무턱대고 줄일수는 없습니다. 이미지 서치나 마우스 클릭과 같이 좌표계를 사용하는 경우 문제가 발생할 수 있기 때문입니다.

     

    이런 문제점들을 피하기 위해서 어느정도 제약이 필요한데요. 화면 전체에 프로그램 수만큼 자동으로 확대 축소하지 않고, 일정 비율을 유지할 수 있도록 했습니다. 그렇기 때문에 사용자는 컴퓨터에서 실행될 프로그램의 수에 맞게 적절하게 배치할 수 있도록 어느정도 사이즈를 미리 계산해둬야 합니다. 매크로의 스크립트를 제작하기 전 오늘 추가할 기능으로 최적의 사이즈를 찾아내서 적용하고, 스크립트 제작을 시작하면 될듯 합니다.

     

    다수의 프로그램을 격자 배치하기 위해 아래와 같이 2개의 속성이 추가 되었습니다.

    [LocalizedCategory("Action")]
    [LocalizedDisplayName("ApplyToAll")]
    [LocalizedDescription("ApplyToAll")]
    [Browsable(true)]
    [DefaultValue(false)]
    public bool ApplyToAll { get; set; }
    
    [LocalizedCategory("Action")]
    [LocalizedDisplayName("GridLayout")]
    [LocalizedDescription("GridLayout")]
    [Browsable(true)]
    [DefaultValue(false)]
    public bool GridLayout { get; set; }

     

    이전에 만들었을 때는 프로그램 하나씩 개별 조작하도록 했었는데요. 이번에는 동일한 이름을 가진 모든 프로그램을 한번에 처리할 수 있도록 했습니다. 이 부분은 핸들 추가 액션 강좌에서 참고할 수 있습니다. 내용이 동일하기 때문에 여기에서는 따로 언급하지 않고 넘어갈께요.

     

    격자 배치는 창 위치를 설정하더라도 무시하고, 좌측 상단 0, 0 좌표를 기준으로 계산합니다. 그리고, 주 모니터에서만 작동합니다.

     

    크기를 조정하는 설정이 있으면 먼저 적용됩니다. 윈도우 API를 사용하기 때문에 내용이 다소 복잡해 보이긴하지만, 동작하는 프로세스는 간단합니다. 모든 프로그램에 적용하려면 ApplyToAll을 True로 변경하고, 핸들 수만큼 동작하도록 코딩하면 됩니다.

    if (Size.HasValue)
    {
        if ((UseControlHandle ? this.ControlHandles : this.MainHandles) != null)
        {
            if (ApplyToAll)
            {
                foreach (var handle in UseControlHandle ? this.ControlHandles : this.MainHandles)
                    Ai.Common.Windows.ApplicationLocationAndSize(
                    handle, IntPtr.Zero, 0, 0, this.Size.Value.Width, this.Size.Value.Height, 
                    Ai.Api.Options.SetWindowPosFlags.SWP_NOMOVE, Ai.Api.Options.WindowMoveCommand.WindowPosition);
            }
            else
                Ai.Common.Windows.ApplicationLocationAndSize(
                UseControlHandle ? ControlHandle : MainHandle, IntPtr.Zero, 0, 0, this.Size.Value.Width, this.Size.Value.Height, 
                Ai.Api.Options.SetWindowPosFlags.SWP_NOMOVE, Ai.Api.Options.WindowMoveCommand.WindowPosition);
        }
    }

     

    사이즈가 없더라도 현재 창 크기를 유지한채로 비율만 변경할수도 있습니다. 위 조건 아래에 아래와 같이 비율 변경 코드를 작성했습니다.

    if (Ratio.HasValue)
    {
        if ((UseControlHandle ? this.ControlHandles : this.MainHandles) != null)
        {
            if (ApplyToAll)
            {
                foreach (var handle in UseControlHandle ? this.ControlHandles : this.MainHandles)
                {
                    Ai.Common.Windows.GetWindowRect(handle, out Rectangle main);
                    int width = (int)(main.Width * (Ratio / 100d));
                    int height = (int)(main.Height * (Ratio / 100d));
    
                    Ai.Common.Windows.ApplicationLocationAndSize(
                    handle, IntPtr.Zero, 0, 0, width, height, 
                    Ai.Api.Options.SetWindowPosFlags.SWP_NOMOVE, Ai.Api.Options.WindowMoveCommand.WindowPosition);
                }
            }
            else
            {
                Ai.Common.Windows.GetWindowRect(UseControlHandle ? ControlHandle : MainHandle, out Rectangle main);
                int width = (int)(main.Width * (Ratio / 100d));
                int height = (int)(main.Height * (Ratio / 100d));
    
                Ai.Common.Windows.ApplicationLocationAndSize(
                UseControlHandle ? ControlHandle : MainHandle, IntPtr.Zero, 0, 0, width, height, 
                Ai.Api.Options.SetWindowPosFlags.SWP_NOMOVE, Ai.Api.Options.WindowMoveCommand.WindowPosition);
            }
        }
    }

     

    정상적으로 동작하는지 테스트하기 위해 메모장을 5개 실행 했습니다. 메모장의 이름이 모두 같기 때문에 전부 크기가 변경될 수 있도록 해줍니다.

    tLHiaJL.jpeg

     

     

    아래 동영상과 같이 창 크기가 500, 400으로 고정된 상태에서 배율만 변경하면서 격자로 배치할 수 있습니다.

     

     

    프로그램이 비율을 유지해야 하는 경우 사이즈는 어느정도 알고 있어야 합니다. 그래야 크기를 변경하고, 더 많은 프로그램을 제어하기 위해서 50프로로 줄여서 화면에 표시해야 합니다. 이렇게하고, 매크로 스크립트를 매인 프로그램에서 제작한 다음에 다른 프로그램들도 처리될 수 있게 하면 좀 더 편리하게 다클라 매크로를 만들 수 있을겁니다. 다만, 디테일한 몇몇 작업들이 더 필요할 수 있고, 비활성이 안되는 환경에서는 몇가지 기술이 더 필요합니다. 이 부분들도 다음에 자세하게 알아보도록 하겠습니다.

     

    개발자에게 후원하기

    MGtdv7r.png

     

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

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

    감사합니다~

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

    댓글목록

    등록된 댓글이 없습니다.