반응형

C#에서 키보드 감지 이벤트를 사용하면 프로그램 내에서는 되지만, 프로그램이 선택되지 않은 상태, 즉 다른 창에 있는 상태에서는 내가 만든 프로그램에서 키보드 감지를 할 수 없다. 이때 사용할 수 있는 것이 GlobalKeyBoardHookLib이라는 nuget 패키지이다. 이 패키지는 winform에서 사용할 수 있도록 만든 패키지이다.

https://www.nuget.org/packages/GlobalKeyBoardHookLib/

 

GlobalKeyBoardHookLib 1.0.0

A library to globally hook keyboard events in .NET applications.

www.nuget.org

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Diagnostics;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace LibraryTest
{
    public partial class main : Form
    {
        private GlobalKeyboardHook _keyboardHook;
        public main()
        {
            InitializeComponent();
            // Initialize global keyboard hook
            _keyboardHook = new GlobalKeyboardHook(); //Generate GlobalKeyboardHook Instance
            _keyboardHook.KeyDownEvent += OnGlobalKeyDown;

            this.FormClosing += MainForm_FormClosing;
        }

        private void MainForm_FormClosing(object sender, FormClosingEventArgs e)
        {
            _keyboardHook.Dispose();
        }

        private void OnGlobalKeyDown(Keys key)
        {
            // Check for a specific key combination (e.g., Ctrl+Shift+C)
            if (key == Keys.C && ModifierKeys.HasFlag(Keys.Control) && ModifierKeys.HasFlag(Keys.Shift))
            {
                // Display the color in a message box (or update a UI element)
                MessageBox.Show("Key Detected!", "Global Keyboard Hook Library Test", MessageBoxButtons.OK, MessageBoxIcon.Information);
            }
        }
    }
}

 

 

1. GlobalKeyboardHook 클래스의 인스턴스를 생성하여 키보드 입력을 감지할 준비를 합니다.

참고로 이 라이브러리는 따로 using statement를 사용할 필요 없이 바로 인스턴스를 생성할 수 있습니다.

_keyboardHook = new GlobalKeyboardHook();

 

2. GlobalKeyboardHook의 KeyDownEvent 이벤트에 OnGlobalKeyDown 메서드를 연결합니다. 키가 눌릴 때마다 이 메서드가 호출됩니다.

_keyboardHook.KeyDownEvent += OnGlobalKeyDown;

 

3. 폼이 닫힐 때 실행될 이벤트 핸들러 MainForm_FormClosing을 등록합니다.

this.FormClosing += MainForm_FormClosing;

 

4. GlobalKeyboardHook 리소스를 해제하여 메모리 누수를 방지합니다.

private void MainForm_FormClosing(object sender, FormClosingEventArgs e)
{
    _keyboardHook.Dispose();
}

 

5. Global 키 입력 이벤트를 처리하는 메서드

private void OnGlobalKeyDown(Keys key)
{
    // Check for a specific key combination (e.g., Ctrl+Shift+C)
    if (key == Keys.C && ModifierKeys.HasFlag(Keys.Control) && ModifierKeys.HasFlag(Keys.Shift))
    {
        // Display the color in a message box (or update a UI element)
        MessageBox.Show("Key Detected!", "Global Keyboard Hook Library Test", MessageBoxButtons.OK, MessageBoxIcon.Information);
    }
}

 

메인 Key인 C랑 보조 키(Modifier Keys)인 Control, Shift가 같이 눌리면 메세지 박스가 보이도록 합니다.

 

오늘은 전역에서 키보드 감지를 할 수 있는 nuget 패키지를 소개해드렸습니다. 이는 Color Picker과 같은 유티릴리티 제작이나, Keylogger과 같은 프로그램을 제작할 때 사용할 수 있을 것 같습니다.

반응형