상세 컨텐츠

본문 제목

[C#] 키보드 후킹하기

C#

by 메타샤워 2023. 7. 18. 18:22

본문

using System;          
using System.Diagnostics;          
using System.Windows.Forms;          
using System.Runtime.InteropServices;          
  
class InterceptKeys          
{          
        private const int WH_KEYBOARD_LL = 13;   
        private const int WM_KEYDOWN = 0x0100;   
        private static LowLevelKeyboardProc _proc = HookCallback;          
        private static IntPtr _hookID = IntPtr.Zero;   
  
        public static void Main()          
        {          
                _hookID = SetHook(_proc);          
                Application.Run();   
                UnhookWindowsHookEx(_hookID);          
        }          
  
        private static IntPtr SetHook(LowLevelKeyboardProc proc)   
        {          
                using (Process curProcess = Process.GetCurrentProcess())   
                using (ProcessModule curModule = curProcess.MainModule)          
                {  
                        return SetWindowsHookEx(WH_KEYBOARD_LL, proc, 
GetModuleHandle(curModule.ModuleName), 0);   
                }          
        }          
          
        private delegate IntPtr LowLevelKeyboardProc(int nCode, IntPtr wParam, IntPtr lParam);          
        private static IntPtr HookCallback(int nCode, IntPtr wParam, IntPtr lParam)   
        {          
                if (nCode >= 0 && wParam == (IntPtr)WM_KEYDOWN)  
                {          
                        int vkCode = Marshal.ReadInt32(lParam);          
                        Console.WriteLine((Keys)vkCode);   
                }          
          
                return CallNextHookEx(_hookID, nCode, wParam, lParam);   
        }  
          
        [DllImport("user32.dll", CharSet = CharSet.Auto, SetLastError = true)]   
        private static extern IntPtr SetWindowsHookEx(int idHook, LowLevelKeyboardProc lpfn, 
IntPtr hMod, uint dwThreadId);     
          
        [DllImport("user32.dll", CharSet = CharSet.Auto, SetLastError = true)]   
        [return: MarshalAs(UnmanagedType.Bool)]   
        private static extern bool UnhookWindowsHookEx(IntPtr hhk);     
          
        [DllImport("user32.dll", CharSet = CharSet.Auto, SetLastError = true)]   
        private static extern IntPtr CallNextHookEx(IntPtr hhk, int nCode, 
IntPtr wParam, IntPtr lParam);   
          
        [DllImport("kernel32.dll", CharSet = CharSet.Auto, SetLastError = true)]   
        private static extern IntPtr GetModuleHandle(string lpModuleName);    
}

'C#' 카테고리의 다른 글

[C#] Interface로 구현한 폼 간 값전달  (0) 2023.07.18
[c# 키워드] Lambda Expression =>  (0) 2023.07.18
[c# 키워드] delegate  (0) 2023.07.18
[c# 키워드] yield  (0) 2023.07.18
[C#] 마우스 후킹하기  (0) 2023.07.18

관련글 더보기