您的位置:首页 > 编程语言 > C#

C#全局键盘钩子

2013-10-15 18:18 429 查看
using System;
using System.Runtime.InteropServices;
using System.Diagnostics;
public class LKeyboard
{
    /// <summary>
    /// 键盘钩子标识。
    /// </summary>
    private static int hKeyBoardHook = 0;

    /// <summary>
    /// 回调函数委托。
    /// </summary>
    /// <param name="nCode">钩子代码。</param>
    /// <param name="wParam"></param>
    /// <param name="lParam"></param>
    /// <returns>表示是否拦截。</returns>
    protected delegate int HookProc(int nCode, int wParam, IntPtr lParam);

    /// <summary>
    /// 设置钩子。
    /// </summary>
    /// <param name="idHook"></param>
    /// <param name="lpfn"></param>
    /// <param name="hInstance"></param>
    /// <param name="threadId"></param>
    /// <returns></returns>
    [DllImport("user32.dll")]
    protected static extern int SetWindowsHookEx(int idHook, HookProc lpfn, IntPtr hInstance, int threadId);
    /// <summary>
    /// 取消钩子 。
    /// </summary>
    /// <param name="idHook"></param>
    /// <returns></returns>
    [DllImport("user32.dll", CharSet = CharSet.Auto, CallingConvention = CallingConvention.StdCall)]
    protected static extern bool UnhookWindowsHookEx(int idHook);
    /// <summary>
    /// 调用下一个钩子 。
    /// </summary>
    /// <param name="idHook"></param>
    /// <param name="nCode"></param>
    /// <param name="wParam"></param>
    /// <param name="lParam"></param>
    /// <returns></returns>
    [DllImport("user32.dll")]
    protected static extern int CallNextHookEx(int idHook, int nCode, int wParam, IntPtr lParam);
    /// <summary>
    /// 获取应用程序模块句柄。
    /// </summary>
    /// <param name="name"></param>
    /// <returns></returns>
    [DllImport("kernel32.dll")]
    protected static extern IntPtr GetModuleHandle(string name);

    #region # 键盘结构 #
    /// <summary>
    /// 键盘结构。
    /// </summary>
    [StructLayout(LayoutKind.Sequential)]
    public class KeyboardStruct
    {
        /// <summary>
        /// 键码。
        /// </summary>
        public int kCode;
        /// <summary>
        /// 
        /// </summary>
        public int scanCode;
        /// <summary>
        /// 
        /// </summary>
        public int flag;
        /// <summary>
        /// 
        /// </summary>
        public int time;
        /// <summary>
        /// 
        /// </summary>
        public int dwExtraInfo;
    }
    #endregion

    #region # 安装钩子 + public bool InstallHook(Func<Int32, KeyboardStruct, bool> fn) #
    /// <summary>
    /// 安装钩子。
    /// </summary>
    /// <param name="method">外部自定义键盘处理方法。</param>
    /// <returns></returns>
    //Int32 keysEvent, KeyboardStruct keyboard, out bool block
    public bool InstallHook(Func<Int32, KeyboardStruct, bool> fn)
    {
        if (hKeyBoardHook == 0)
        {
            Process currProc = Process.GetCurrentProcess();
            //获取当前进程主模块。
            ProcessModule currModule = currProc.MainModule;
            //获取实例句柄。
            IntPtr currHandle = GetModuleHandle(currModule.ModuleName);
            hKeyBoardHook = SetWindowsHookEx(13, GetCallback(fn), currHandle, 0);

            if (hKeyBoardHook == 0)//如果钩子安装失败。
                UnInstallHook();
            else
                return true;
        }
        return false;
    }
    #endregion

    #region # 卸载钩子 #
    /// <summary>
    /// 卸载钩子。
    /// </summary>
    /// <returns></returns>
    public bool UnInstallHook()
    {
        if (hKeyBoardHook != 0)
            if (UnhookWindowsHookEx(hKeyBoardHook))
            {
                hKeyBoardHook = 0;
                return true;
            }
        return false;
    }
    #endregion

    #region # 返回一个钩子回调函数 #
    /// <summary>
    /// 返回一个钩子回调函数。
    /// </summary>
    /// <param name="fn">外部传入的回调函数。</param>
    /// <returns></returns>
    private HookProc GetCallback(Func<Int32, KeyboardStruct, bool> fn)
    {
        return (nCode, wParam, lParam) =>
        {
            if (nCode >= 0)
            {
                KeyboardStruct keyboardStruct = (KeyboardStruct)Marshal.PtrToStructure(lParam, typeof(KeyboardStruct));//转换结构。
                if (fn(wParam, keyboardStruct))
                    return 1;//返回1表示拦截。
            }
            return CallNextHookEx(hKeyBoardHook, nCode, wParam, lParam);
        };
    }
    #endregion

    #region # 屏蔽系统热键 + public void EnabledShortcutKeys(bool block) #
    /// <summary>
    /// 屏蔽系统热键。包括以下按键:Tab,Ctrl,Alt,Shift,Windows,F4,F5
    /// </summary>
    /// <param name="block">true屏蔽,false取消屏蔽。</param>
    public void EnabledShortcutKeys(bool block)
    {
        Func<Int32, KeyboardStruct, bool> fn = (nCode, key) =>
        {
            if (key.kCode == 0x9 //Tab键。
             || key.kCode == 0x11 //Ctrl键。
             || key.kCode == 0x12 //Alt键。
             || key.kCode == 0x10 //Shift键。
             || key.kCode == 91 //左Windows键。
             || key.kCode == 92 //右Windows键。
             || key.kCode == 0x73//F4键。
             || key.kCode == 0x74//F5键。
             )
                return true;
            return false;
        };
        if (block)
            this.InstallHook(fn);
        else
            this.UnInstallHook();
    }
    #endregion
}

调用:

LKeyboard keyboard = new LKeyboard();
            //屏蔽常用快捷键。 
            keyboard.EnabledShortcutKeys(false);

            //屏蔽A按键。
            keyboard.InstallHook((nCode, key) =>
            {
                if (key.kCode == (int)Keys.A)
                    return true;
                return false;
            });



                                            
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: