NGMsoftware

NGMsoftware
로그인 회원가입
  • 매뉴얼
  • NGM 6
  • 매뉴얼

    NGM 6

    본 사이트의 컨텐츠는 저작권법의 보호를 받으므로 무단 복사, 게재, 배포 등을 금합니다.

    디자이너 디자이너 매크로 프로그램에서 실행 및 중지 버튼의 단축키를 설정하는 방법.

    페이지 정보

    본문

    안녕하세요. 엔지엠소프트웨어입니다. [ 이전 예제 ]에서 추가한 버튼에 단축키를 어떻게 만드는지 알아보도록 하겠습니다. 비주얼 스튜디오를 실행하고, 예제에서 사용된 프로젝트를 불러옵니다. 그리고, 디자인을 보면 아래와 같을건데요. 저는 스크립트와 버튼만 남겨놓고 모두 삭제 했습니다.

    6AmimcW.gif

     

     

    단축키 기능은 엔지엠 디자이너에서 자동으로 처리되지는 않습니다. 단축키 동작을 구현하는 방식이 워낙 다양하기 때문인데요. 어느정도 사용자가 직접 처리할 수 있도록 여지를 남겨둔겁니다. 실제로 글로벌 단축키는 잘 사용하지 않습니다. 실행중인 다른 프로그램과 단축키가 중복되면 충돌이 발생할 수 있기 때문입니다. 그리고, 단축키가 실행될 때 해당 키의 명령을 취소 시키기도 합니다. 그래서, 의도하지 않게 동작하지 않는 경우들도 발생합니다. 우선, 글로벌 단축키를 처리하는 방법에 대해 알아보도록 하겠습니다. 코드 보기(F7)로 화면을 전환하세요.

     

    아래와 같이 [ 기본 생성자(public Form5) ]에서 폼로드 이벤트를 추가하세요. 코드는 this.Load += Form5_Load입니다. 여러분들은 Form5가 아닌 Form1일겁니다.

    namespace DesignerDefaultTest
    {
        public partial class Form5 : Designer.ComponentDefault.MainView
        {
            public Form5()
            {
                InitializeComponent();
    
                this.Load += Form5_Load;
            }

     

    F5를 눌러서 프로그램을 실행하면, 기본 생성자가 가장 먼저 호출됩니다. 이때는 메모리에 로드하는 작업이므로 실제로 폼이 화면에 표시되지는 않습니다. 따라서, 내 프로그램이 화면에 모두 표시될 때 처리할 내용들을 폼 로드 이벤트에서 작성해야 합니다. Form5_Load 이벤트 핸들러의 코드를 볼까요? 코드가 그리 복잡하지는 않은데요. 우선, 단축키가 설정되어 있는지 체크해야 합니다. Keys.None이 아니라면 사용자가 뭔가 단축키를 설정한겁니다. 자~ 그러면 엔지엠 프레임워크에서 제공해주는 글로벌 단축키 유틸리티를 사용해서 키보드를 후킹해줍니다.

    private void Form5_Load(object sender, EventArgs e)
    {
        if (stopButton1.ButtonShortcut != Keys.None)
        {
            NGM.Utility.MouseKeyboardManager.HookManager.KeyUp += HookManager_KeyUp;
        }
    }

     

    위에서는 단축키를 키업으로 후킹했습니다. 키다운과 키업은 미묘한 차이가 있습니다. 키다운은 키보드를 누를 때 이벤트가 발생합니다. 따라서, 키누르는 행위를 취소하고 다른 동작을 수행하도록 변조할 수 있습니다. 예를 들어서 프린트 스크린키를 누르면 화면이 캡쳐되는데요. 이 키를 후킹하면 사용자가 프린트 스크린을 눌렀을 때 다른키로 교체할 수 있습니다. 물론, 키다운과 키업을 둘다 후킹해서 처리할수도 있습니다. 위에서 += HookManager_KeyUp은 이벤트 핸들러를 추가한겁니다. 그래서, 아래와 같이 코드를 한번 더 작성해야 합니다.

    private void HookManager_KeyUp(object sender, KeyEventArgs e)
    {
        if (e.KeyCode == stopButton1.ButtonShortcut)
        {
            stopButton1.PerformClick();
        }
    }

     

     

    사용자가 실제로 눌렀다가 땐 키(e.KeyCode)가 StopButton(중지)에서 설정한 단축키와 같은지 체크합니다. 단축키가 같으면 StopButton을 프로그래밍적으로 클릭하는 PerformClick을 수행하도록 코딩되어 있습니다. 어느정도 수준으로 설명해야 할지... 정말 많은 고민이 있습니다. 개발자가 아니라면 왜 이렇게 코딩해야 하고 동작되는지 지금 당장은 이해할 수 없을겁니다. 코드를 다양하게 변경해보면서 눈으로 어떻게 동작하는지를 봐야 학습 속도가 빨라집니다.

     

    이번에는 글로벌 단축키가 아닌 로컬 키를 등록 해보도록 하겠습니다. 보통 윈폼 핫키 처리 프로세스는 아래와 같이 처리합니다. 일반적으로 가장 많이 쓰이는 코드입니다. 개발자들도 그냥 외워서 사용하는 대표적인 코드중에 하나입니다. ProcessCmdKey는  오버라이드(Override, 재정의)해서 사용해야 합니다. 오버라이드에 대한 내용은 [ 여기 ]를 한번 읽어보세요.

    • 제정: 법률이나 규칙등등을 만들어서 정함
    • 재정: 두번째 고쳐서 바로 잡음
    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;
    
    namespace DesignerDefaultTest
    {
        public partial class Form5 : Designer.ComponentDefault.MainView
        {
            public Form5()
            {
                InitializeComponent();
            }
    
            protected override bool ProcessCmdKey(ref Message msg, Keys keyData)
            {
                if (keyData == stopButton1.ButtonShortcut)
                {
                    stopButton1.PerformClick();
                    return true;
                }
                return base.ProcessCmdKey(ref msg, keyData);
            }
    
            public override void WriteOutput(string id, string description, string message)
            {
                Console.WriteLine(message);
            }
        }
    }

     

    이 방식은 글로벌하게 키보드를 후킹하는건 아닙니다. 따라서, 실행중인 윈폼을 선택한 후 단축키를 눌러야만 동작합니다. 그래서, 아래 동영상처럼 스크립트가 실행될 때 윈폼을 재빠르게 클릭해서 활성화 시킨 후 단축키 A를 눌러야합니다. 만약, 실행되는 액션 사이에 지연(Delay)이 없다면... 중지하는데 어려움이 발생하게 됩니다. 어쩌면 윈도우를 재부팅해야 할수도 있어요. 그렇기 때문에 매크로 프로그램들은 대부분 글로벌 키보드 후킹을 사용합니다.

    IzlBEd7.gif

     

     

    엔지엠 매크로 프로그램을 개발자가 사용한다면 정말 많은 것들을 할 수 있습니다. 하지만, 비개발자가 고난이도의 뭔가 기능을 확장하고 싶다면 정말 많은 시간과 노력이 필요합니다. 대부분은 중도에 포기하게 될거구요^^; 하지만, RPA 업무 자동화 관련 분야는 지속적으로 성장하는 4차 산업입니다. 기술을 배워두면 업무 자동화 업무를 수주받아서 부가적인 수입을 올릴수도 있습니다. 복잡한 업무를 RPA 매크로로 구현하는데는 한계가 있으므로 커스텀 모듈과 디자이너 및 프레임워크를 다룰 수 있으면 정말 파워풀한 자동화 프로그램을 만들어 낼 수 있습니다.

     

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

    개발자에게 후원하기

    MGtdv7r.png

     

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

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

    감사합니다~

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

    댓글목록

    등록된 댓글이 없습니다.