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; });
相关文章推荐
- C#.Net的全局键盘钩子(Hook)技术
- C#.Net的全局键盘钩子(Hook)技术
- 转自sgear博客:C#.Net的全局键盘钩子(Hook)技术
- c# 全局钩子之键盘 (实例)
- C#.Net的全局键盘钩子(Hook)技术
- c# 钩子屏蔽键盘快捷键
- C#使用全局钩子(hook),SetWindowsHookEx返回0、不回调的解决
- 用全局钩子截掉所有进程的鼠标和键盘 DLL的调试方法
- 全局钩子接收键盘消息并产生新的全局键盘消息
- C#键盘鼠标钩子
- C#鼠标键盘钩子
- 如何让你的程序避开全局键盘钩子的监视
- 使用SetWindowsHookEx(WH_KEYBOARD,...)制作全局键盘钩子
- C#低级Windows API钩子拦截键盘输入
- SetWindowsHookEx设置全局键盘钩子
- Windows全局钩子dll(键盘)
- 用钩子(hook)实现C#的屏幕键盘效果
- 全局键盘钩子实现
- 用c语言编写全局键盘钩子
- C# 键盘钩子,真正解决大小写/shift后字符获取问题,原创