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과 같은 프로그램을 제작할 때 사용할 수 있을 것 같습니다.