KeiStory

C# 키보드 후킹하기

 

다른 프로그램의 키입력을 후킹하여 값을 가져오는 코드입니다.

using System;
using System.Runtime.InteropServices;
using System.Windows.Forms;

namespace Hooking
{
    public partial class MainForm : Form
    {
        [DllImport("user32.dll")]
        static extern IntPtr SetWindowsHookEx(int idHook, LowLevelKeyboardProc callback, IntPtr hInstance, uint threadId);
 
        [DllImport("user32.dll")]
        static extern bool UnhookWindowsHookEx(IntPtr hInstance);
 
        [DllImport("user32.dll")]
        static extern IntPtr CallNextHookEx(IntPtr idHook, int nCode, int wParam, IntPtr lParam);
 
        [DllImport("kernel32.dll")]
        static extern IntPtr LoadLibrary(string lpFileName);
 
        private delegate IntPtr LowLevelKeyboardProc(int nCode, IntPtr wParam, IntPtr lParam);
 
        const int WH_KEYBOARD_LL = 13;
        const int WM_KEYDOWN = 0x100;
 
        private IntPtr hook = IntPtr.Zero;
 
 
        public MainForm()
        {
            InitializeComponent();
 
            this.Load += MainForm_Load;
            this.FormClosing += MainForm_Closing;
        }
 
        private void SetHook()
        {
            IntPtr hInstance = LoadLibrary("User32");
 
            hook = SetWindowsHookEx(WH_KEYBOARD_LL, HookProc, hInstance, 0);
        }
 
        private void UnHook()
        {
            UnhookWindowsHookEx(hook);
        }
 
        private IntPtr HookProc(int code, IntPtr wParam, IntPtr lParam)
        {
            if (code >= 0 && wParam == (IntPtr)WM_KEYDOWN)
            {
                int vkCode = Marshal.ReadInt32(lParam);
 
                // 키 입력에 따른 처리를 추가합니다.
                if (vkCode.ToString() == "17")
                {
                    this.hookTextBox.AppendText("CTRL");
                }
                else if (vkCode.ToString() == "91")
                {
                    this.hookTextBox.AppendText("LEFT WINDOW");
                }
                else if (vkCode.ToString() == "18")
                {
                    this.hookTextBox.AppendText("ALT");
                }
                else if (vkCode.ToString() == "32")
                {
                    this.hookTextBox.AppendText("SPACE BAR");
                }
                else if (vkCode.ToString() == "92")
                {
                    this.hookTextBox.AppendText("RIGHT WINDOW");
                }
                else if (vkCode.ToString() == "93")
                {
                    this.hookTextBox.AppendText("SELECT KEY");
                }
                else if (vkCode.ToString() == "16")
                {
                    this.hookTextBox.AppendText("SHIFT");
                }
                else if (vkCode.ToString() == "20")
                {
                    this.hookTextBox.AppendText("CAPS LOCK");
                }
                else if (vkCode.ToString() == "9")
                {
                    this.hookTextBox.AppendText("TAB");
               }
                else if (vkCode.ToString() == "96")
                {
                    this.hookTextBox.AppendText("numpad 0");
                }
                else if (vkCode.ToString() == "97")
                {
                    this.hookTextBox.AppendText("numpad 1");
                }
                else if (vkCode.ToString() == "98")
                {
                    this.hookTextBox.AppendText("numpad 2");
                }
                else if (vkCode.ToString() == "99")
                {
                    this.hookTextBox.AppendText("numpad 3");
                }
                else if (vkCode.ToString() == "100")
                {
                    this.hookTextBox.AppendText("numpad 4");
                }
                else if (vkCode.ToString() == "101")
                {
                    this.hookTextBox.AppendText("numpad 5");
                }
                else if (vkCode.ToString() == "102")
                {
                    this.hookTextBox.AppendText("numpad 6");
                }
                else if (vkCode.ToString() == "103")
                {
                    this.hookTextBox.AppendText("numpad 7");
                }
                else if (vkCode.ToString() == "104")
                {
                    this.hookTextBox.AppendText("numpad 8");
                }
                else if (vkCode.ToString() == "105")
                {
                    this.hookTextBox.AppendText("numpad 9");
                }
 
                this.hookTextBox.AppendText(" | "); // 구분자
 
                return CallNextHookEx(hook, code, (int)wParam, lParam); // 키입력을 정상적으로 동작하게 합니다.
 
                //return (IntPtr)1; // 키입력을 무효화 합니다.
            }
            else
            {
                return CallNextHookEx(hook, code, (int)wParam, lParam);
            }
        }
 
        private void MainForm_Load(object sender, EventArgs e)
        {
            SetHook();
        }
 
        private void MainForm_Closing(object sender, System.ComponentModel.CancelEventArgs e)
        {
            UnHook();
        }
    }
}

어떤 프로그램이든 키보드 입력이 있는 경우 아래처럼 후킹되어 표시됩니다.

반응형

'코딩 > C#' 카테고리의 다른 글

LM-Kit.NET 활용하기  (0) 2024.10.27
C# RabbitMQ Management 실행하기  (0) 2024.10.14
C# RabbitMQ 사용하기 (Windows)  (0) 2024.10.14
C# Serilog 적용 및 Seq 연동하기  (0) 2024.10.12
dotnet-dump 사용 및 분석하기  (0) 2024.10.11

공유하기

facebook twitter kakaoTalk kakaostory naver band