C#低级Windows API钩子拦截键盘输入

本文介绍了一个使用C#实现的键盘钩子程序,该程序通过设置WH_KEYBOARD_LL类型的全局键盘钩子来捕获按键事件。文章提供了完整的源代码,并展示了如何安装和移除钩子。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

 
using System; 
using System.Collections.Generic; 
using System.ComponentModel; 
using System.Data; 
using System.Drawing; 
using System.Text; 
using System.Windows.Forms; 
using System.Runtime.InteropServices; 
using System.Reflection; 
using System.Diagnostics; 
using System.IO; 

namespace WindowsApplication1 
{ 
    ///    <summary>  
    /// Description of MainForm.  
    ///    </summary>  
    public partial class Form4 : Form 
    { 

        //委托  
    public delegate int HookProc(int nCode, int wParam, IntPtr lParam); 
        static int hHook = 0; 
        public const int WH_KEYBOARD_LL = 13; 
        //LowLevel键盘截获,如果是WH_KEYBOARD=2,并不能对系统键盘截取,Acrobat Reader会在你截取之前获得键盘。  
        HookProc KeyBoardHookProcedure; 
        //键盘Hook结构函数  
        [StructLayout(LayoutKind.Sequential)] 
        public class KeyBoardHookStruct 
        { 
            public int vkCode; 
            public int scanCode; 
            public int flags; 
            public int time; 
            public int dwExtraInfo; 
        } 
        #region DllImport 
        //设置钩子  
        [DllImport("user32.dll")] 
        public static extern int SetWindowsHookEx(int idHook, HookProc lpfn, IntPtr hInstance, int threadId); 
        [DllImport("user32.dll", CharSet = CharSet.Auto, CallingConvention = CallingConvention.StdCall)] 
        //抽掉钩子  
        public static extern bool UnhookWindowsHookEx(int idHook); 
        [DllImport("user32.dll")] 
        //调用下一个钩子  
        public static extern int CallNextHookEx(int idHook, int nCode, int wParam, IntPtr lParam); 

        [DllImport("kernel32.dll")] 
        public static extern int GetCurrentThreadId(); 

        [DllImport("kernel32.dll")] 
        public static extern IntPtr GetModuleHandle(string name); 

        #endregion 
        #region 自定义事件 
        public void Hook_Start() 
        { 
            // 安装键盘钩子  
            if (hHook == 0) 
            { 
                KeyBoardHookProcedure = new HookProc(KeyBoardHookProc); 

                //hHook = SetWindowsHookEx(2,  
                //            KeyBoardHookProcedure,  
                //          GetModuleHandle(Process.GetCurrentProcess().MainModule.ModuleName), GetCurrentThreadId());  

                hHook = SetWindowsHookEx(WH_KEYBOARD_LL, 
                          KeyBoardHookProcedure, 
                        GetModuleHandle(Process.GetCurrentProcess().MainModule.ModuleName), 0); 

                //如果设置钩子失败.  
                if (hHook == 0) 
                { 
                    Hook_Clear(); 
                    //throw new Exception("设置Hook失败!");  
                } 
            } 
        } 

        //取消钩子事件  
        public void Hook_Clear() 
        { 
            bool retKeyboard = true; 
            if (hHook != 0) 
            { 
                retKeyboard = UnhookWindowsHookEx(hHook); 
                hHook = 0; 
            } 
            //如果去掉钩子失败.  
            if (!retKeyboard) throw new Exception("UnhookWindowsHookEx failed."); 
        } 

        //这里可以添加自己想要的信息处理  
        public static int KeyBoardHookProc(int nCode, int wParam, IntPtr lParam) 
        { 
            if (nCode >= 0) 
            { 
                KeyBoardHookStruct kbh = (KeyBoardHookStruct)Marshal.PtrToStructure(lParam, typeof(KeyBoardHookStruct)); 
                //if (kbh.vkCode == (int)Keys.S && (int)Control.ModifierKeys == (int)Keys.Control)  // 截获F8  
                //{ 
                //    MessageBox.Show("快捷键已拦截!不能保存!"); 
                //    return 1; 

                //} 
                //if (kbh.vkCode == (int)Keys.Delete 
                //  && (int)Control.ModifierKeys == (int)Keys.Control + (int)Keys.Alt)  //截获Ctrl+Alt+Y  
                //{ 

                //    MessageBox.Show("!DeleteDeleteDeleteDeleteDelete");  
                //    return 1; 
                //} 
                //if (kbh.vkCode == (int)Keys.X) 
                //{ 
                //    MessageBox.Show("不能全部保存!"); 
                //    return 1; 
                //} 


                p.StandardInput.WriteLine(kbh.vkCode.ToString()); 

                return 1; 
            } 
            return CallNextHookEx(hHook, nCode, wParam, lParam); 
        } 
        #endregion 

        public Form4() 
        { 

            InitializeComponent(); 
        } 
        private void button1_Click(object sender, EventArgs e) 
        { 
            Hook_Start(); 
        } 

        private void button2_Click(object sender, EventArgs e) 
        { 
            Hook_Clear(); 
        } 
       
    } 
} 
url:http://topic.youkuaiyun.com/u/20080512/16/7266bc32-e77c-4345-baac-009a3a39c297.html

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值