C# 애플리케이션에서 HotKey 사용하기

C# 애플리케이션에서 HotKey 설정하는 방법에 대해 설명합니다.

HotKey는 일반적으로 단축키로 알려진 기능이며 프로그램 실행후 언제든지 해당 키보드의 키를 누르면 정해진 동작이 실행되는 기능을 말합니다.

C# 애플리케이션에서 HotKey 설정은 의외로 간단한데 User32.dll을 DllImport를 한 후 RegisterHotKey, UnregisterHotKey 메서드를 사용하면 쉽게 단축키의 등록 및 해제가 가능합니다.

간단히 HotKey 테스트를 위해 .NETFrameWork를 사용하는 Form을 아래와 같이 작성하였습니다.

HotKey test example
HotKey Demo Program

 

HotKey 메서드 호출

먼저 User32.dll을 DllImport하여 RegisterHotKey, UnregisterHotKey 메서드를 호출할 수 있도록 설정해 줍니다.

const int HOTKEY_ID = 123123;

public enum KeyModifiers {
    None = 0,
    Alt = 1,
    Control = 2,
    Shift = 4,
    Windows = 8
}

[DllImport("user32.dll")]
public static extern bool RegisterHotKey(IntPtr hWnd, int id, KeyModifiers fsModifiers, Keys vk);

[DllImport("user32.dll")]
public static extern bool UnregisterHotKey(IntPtr hWnd, int id);

위 RegisterHotKey 메서드의 파라미터값을 보면 등록에 필요한 ID값은 임의값(123123)을 사용하였고, Modifiers값은 아래 테이블 값을 참고하시면 됩니다.

참고 URL : https://learn.microsoft.com/ko-kr/windows/win32/inputdev/wm-hotkey

+-------------+--------+--------------------------------------+
| MOD_ALT     | 0x0001 | ALT 키 중 하나가 눌려져 있습니다.        |
+-------------+--------+--------------------------------------+
| MOD_CONTROL | 0x0002 | CTRL 키 중 하나가 눌려져 있습니다.       |
+-------------+--------+--------------------------------------+
| MOD_SHIFT   | 0x0004 | SHIFT 키 중 하나가 눌려져 있습니다.      |
+-------------+--------+--------------------------------------+
| MOD_WIN     | 0x0008 | 두 WINDOWS 키 중 하나가 눌려져 있습니다. |
+-------------+--------+--------------------------------------+

마지막 파라미터인 Keys값은 가상 키값을 설정하면 됩니다.

참고 URL : https://learn.microsoft.com/ko-kr/windows/win32/inputdev/virtual-key-codes

 

단축키 등록 및 해제

제 경우 Form이 생성/해제되는 이벤트에서 단축키를 등록/해제하도록 하였습니다.

아래 소스 코드는 KeyModifiers.Control + KeyModifiers.Shift + Keys.N의 단축키를 등록한 예제입니다.

private void Form1_Load(object sender, EventArgs e) {
    RegisterHotKey(this.Handle, HOTKEY_ID, KeyModifiers.Control | KeyModifiers.Shift, Keys.N);
}

private void Form1_FormClosing(object sender, FormClosingEventArgs e) {
    UnregisterHotKey(this.Handle, HOTKEY_ID);
}

 

HotKey 메시지 핸들링

위와 같이 HotKey를 등록후 실제 HotKey 메시지를 수신하여 단축키를 확인 후 해당 동작이 수행되도록 작성하시면 됩니다.

여기서는 KeyModifiers.Control + KeyModifiers.Shift + Keys.N 인 경우 노트패드 프로그램을 실행하도록 하였습니다.

참고 URL : https://learn.microsoft.com/ko-kr/windows/win32/inputdev/wm-hotkey

const int WM_HOTKEY = 0x0312;
protected override void WndProc(ref Message message) {
    switch (message.Msg) {
        case WM_HOTKEY:
            Keys key = (Keys)(((int)message.LParam >> 16) & 0xFFFF);
            KeyModifiers modifier = (KeyModifiers)((int)message.LParam & 0xFFFF);

            if ((KeyModifiers.Control | KeyModifiers.Shift) == modifier && Keys.N == key) {
                Process.Start("notepad.exe");
            }

            break;
    }
    base.WndProc(ref message);
}

위와 같이 작성후 실행해 보면 아래 이미지의 왼쪽과 같이 실행되는데 HotKey인 Ctrl + Shift + N 키를 누르면 Windows 메모장이 실행되는것을 확인할 수 있습니다.

C# 애플리케이션에서 HotKey 실행
C# 애플리케이션에서 HotKey 실행

몇 줄 안되는 코드로 간단히 C# 프로그램에서 단축키를 설정하여 동작시킬 수 있었습니다.

간단하면서도 매우 유용한 기능으로 많이 활용할 수 있을것 같습니다.

Leave a Comment