반응형

아래 방법외에도 아래와 같은 방법이 있습니다.


[C# WPF user32.dll 이용하여 전역 키 후킹하기, 핫키 등록하기 / 키 보내기 (1) API와 상수보기]


[C# WPF user32.dll 이용하여 전역 키 후킹하기, 핫키 등록하기 / 키 보내기 (2) API 예제보기]







유틸 프로그램을 만들다 보니 


프로그램 내에서만 쓸 단축키와

프로그램 바깥에서 즉, 프로그램 비활성화 상태에서도 핫키를 사용해야 해서

찾아 적용해 보았습니다. 


둘 다를 소개하는 곳이 없어 제가 나중에라도 찾아볼 수 있도록 정리했는데 누군가에게 조금이라도

도움이 되었으면 좋겠네요.




1. 프로그램 내에서의 핫키 Hot Key 지정


윈폼에서 기본으로 제공하는 메소드를 Override 하여 사용 합니다.

        protected override bool ProcessCmdKey(ref Message msg, Keys keyData)

        {

            Keys key = keyData & ~(Keys.Shift | Keys.Control);


            switch (key)

            {

                case Keys.F:

                    // 조합키 사용 시

                    if ((keyData & Keys.Control) != 0)

                    {

                        MessageBox.Show("Ctrl+F");

                    }

                    break;

                case Keys.F5:

                    // 단일키 사용시

                    MessageBox.Show("f5");

                    break;

                default: 

                    MessageBox.Show("지정되지 않은 키입니다.");

                    return base.ProcessCmdKey(ref msg, keyData);

            }

            return true;

        }




2. 비활성화 상태에서도 사용하는 단축키 설정


User32.dll 파일내의 함수를 이용합니다.


       //핫키등록

        [DllImport("user32.dll")]

        private static extern int RegisterHotKey(int hwnd, int id, int fsModifiers, int vk);


        //핫키제거

        [DllImport("user32.dll")]

        private static extern int UnregisterHotKey(int hwnd, int id);


        // 윈폼 생성 시 등록

        private void mainForm_load(object sender, EventArgs e)

        {

            // 0x0 : 조합키 없이 사용, 0x1: ALT, 0x2: Ctrl, 0x3: Shift

            //RegisterHotKey(핸들러함수, 등록키의_ID, 조합키, 등록할_키)

            RegisterHotKey((int)this.Handle, 0, 0x0, (int) Keys.Up); 

            RegisterHotKey((int)this.Handle, 1, 0x0, (int) Keys.Down);

        }


   // 윈폼 종료 시 제거

        private void mainFrom_close(object sender, FormClosedEventArgs e)

        {

            UnregisterHotKey((int)this.Handle, 0); //이 폼에 ID가 0인 핫키 해제

            UnregisterHotKey((int)this.Handle, 1);

        }


   // 윈도우프로시저 콜백함수

        protected override void WndProc(ref Message m) 

        {

            base.WndProc(ref m);


            if (m.Msg == (int)0x312) //핫키가 눌러지면 312 정수 메세지를 받게됨

            {

                if (m.WParam == (IntPtr)0x0) // 그 키의 ID가 0이면

                {

                    listViewFile_move(-1);

                }

                if (m.WParam == (IntPtr)0x1) // 그 키의 ID가 1이면

                {

                    listViewFile_move(+1);

                }

            }

        }


반응형

WRITTEN BY
데르벨준

,