c# 钩子(hook)键盘

c#钩子键盘核心管理类

using System;
using System.Collections.Generic;
using System.Text;
using System.Runtime.InteropServices;
using System.Reflection;
using System.Diagnostics;
using Microsoft.Win32;
using System.Windows.Forms;

namespace WindowsFormsApplication1
{
    /// <summary> 
    /// 键盘Hook管理类,
    /// </summary> 
    public class KeyboardHookLib
    {
        private const int WH_KEYBOARD_LL = 13; //键盘 

        //键盘处理事件委托 ,当捕获键盘输入时调用定义该委托的方法. 
        private delegate int HookHandle(int nCode, int wParam, IntPtr lParam);

        //客户端键盘处理事件 
        public delegate void ProcessKeyHandle(HookStruct param, out bool handle);

        //接收SetWindowsHookEx返回值 
        private static int _hHookValue = 0;

        //勾子程序处理事件 
        private HookHandle _KeyBoardHookProcedure;

        //Hook结构 
        [StructLayout(LayoutKind.Sequential)]
        public class HookStruct
        {
            public int vkCode;
            public int scanCode;
            public int flags;
            public int time;
            public int dwExtraInfo;
        }

        //设置钩子 
        [DllImport("user32.dll")]
        private static extern int SetWindowsHookEx(int idHook, HookHandle lpfn, IntPtr hInstance, int threadId);

        //取消钩子 
        [DllImport("user32.dll", CharSet = CharSet.Auto, CallingConvention = CallingConvention.StdCall)]
        private static extern bool UnhookWindowsHookEx(int idHook);

        //调用下一个钩子 
        [DllImport("user32.dll")]
        private static extern int CallNextHookEx(int idHook, int nCode, int wParam, IntPtr lParam);

        //获取当前线程ID 
        [DllImport("kernel32.dll")]
        private static extern int GetCurrentThreadId();

        //Gets the main module for the associated process. 
        [DllImport("kernel32.dll")]
        private static extern IntPtr GetModuleHandle(string name);

        private IntPtr _hookWindowPtr = IntPtr.Zero;

        //构造器 
        public KeyboardHookLib() { }

        //外部调用的键盘处理事件 
        private static ProcessKeyHandle _clientMethod = null;

        /// <summary> 
        /// 安装勾子 
        /// </summary> 
        /// <param name="hookProcess">外部调用的键盘处理事件</param> 
        public void InstallHook(ProcessKeyHandle clientMethod)
        {
            _clientMethod = clientMethod;

            // 安装键盘钩子 
            if (_hHookValue == 0)
            {
                _KeyBoardHookProcedure = new HookHandle(OnHookProc);

                _hookWindowPtr = GetModuleHandle(Process.GetCurrentProcess().MainModule.ModuleName);

                _hHookValue = SetWindowsHookEx(
                WH_KEYBOARD_LL,
                _KeyBoardHookProcedure,
                _hookWindowPtr,
                0);

                //如果设置钩子失败. 
                if (_hHookValue == 0) UninstallHook();
            }
        }

        //取消钩子事件 
        public void UninstallHook()
        {
            if (_hHookValue != 0)
            {
                bool ret = UnhookWindowsHookEx(_hHookValue);
                if (ret) _hHookValue = 0;
            }
        }

        //钩子事件内部调用,调用_clientMethod方法转发到客户端应用。 
        private static int OnHookProc(int nCode, int wParam, IntPtr lParam)
        {
            if (nCode >= 0)
            {
                //转换结构 
                HookStruct hookStruct = (HookStruct)Marshal.PtrToStructure(lParam, typeof(HookStruct));

                if (_clientMethod != null)
                {
                    bool handle = false;
                    //调用客户提供的事件处理程序。 
                    _clientMethod(hookStruct, out handle);
                    if (handle) return 1; //1:表示拦截键盘,return 退出 
                }
            }
            return CallNextHookEx(_hHookValue, nCode, wParam, lParam);
        }

    }
}

  form1窗体类

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

namespace WindowsFormsApplication1
{

    public partial class Form1 : Form
    {
        private KeyboardHookLib _keyboardHook = null;
        public Form1()
        {
            InitializeComponent();
            button1.Visible = false;
            button2.Visible = false;
        }
        #region
        /*
        public void Close_Frm()
        {
            
            Process []p = Process.GetProcesses();
            
            foreach (var item in p)
            {
             
                if(Form1.FindWindow("","QQ")!=0)
                {
                    MessageBox.Show("QQ运行!");
                }
                if(item.ProcessName=="QQ")
                {
                    textBox1.Text += item.ProcessName + "|Pid:\t" + item.Id + "|SessionId:\t" + item.SessionId;
                    textBox1.Text += "机器名:";
                    textBox1.Text += item.MachineName ;
                    textBox1.Text += "窗体名称:";
                    textBox1.Text += item.MainWindowTitle;
                    textBox1.Text += "窗体句柄";
                  textBox1.Text+=  item.Handle;

                    
                }
            }
        
        }
        */
        #endregion
        private void Form1_Load(object sender, EventArgs e)
        {
            button1_Click(null, null);
        }

        private void button1_Click(object sender, EventArgs e)
        {
            //安装勾子 
            _keyboardHook = new KeyboardHookLib();
            _keyboardHook.InstallHook(this.OnKeyPress);
            textBox1.Text += "你按下:";
        }

        private void button2_Click(object sender, EventArgs e)
        {
            //取消勾子 
            if (_keyboardHook != null) _keyboardHook.UninstallHook();

        }
        public void OnKeyPress(KeyboardHookLib.HookStruct hookStruct, out bool handle)
        {
            handle = false; //预设不拦截任何键 
            Keys key = (Keys)hookStruct.vkCode;

            //  textBox1.Text = key.ToString();
            string keyName = key.ToString();
            textBox1.Text += "|" + (key == Keys.None ? "" : keyName);
            return;
           

        }

        private void Form1_FormClosed(object sender, FormClosedEventArgs e)
        {
            button2_Click(null, null);
        }
    }

}

  

posted on 2015-04-11 08:41  胡双挺  阅读(6772)  评论(0编辑  收藏  举报

导航