c# 键盘勾子
来源:互联网 发布:众品集团怎么样知乎 编辑:程序博客网 时间:2024/04/29 04:37
PowerPoint在放映模式下,如果用户按Esc键,PowerPoint直接退出放映模式。在查看了相关PowerPoint API没有找到PowerPoint退出放映模式前的事件,只好使用键盘勾子去捕获Esc按键。
public class KeyboardHookDll { //Hook结构 [StructLayout(LayoutKind.Sequential)] public class HookStruct { public int vkCode; public int scanCode; public int flags; public int time; public int dwExtraInfo; } //键盘 private const int WH_KEYBOARD_LL = 13; //接收SetWindowsHookEx返回值 private static int _hHookValue = 0; //钩子程序处理事件 private HookHandle _KeyBoardHookProcedure; //外部调用的键盘处理事件 private static ProcessKeyHandle _clientMethod = null; private IntPtr _hookWindowPtr = IntPtr.Zero; //键盘处理事件委托 ,当捕获键盘输入时调用定义该委托的方法. private delegate int HookHandle(int nCode, int wParam, IntPtr lParam); //客户端键盘处理事件 public delegate void ProcessKeyHandle(HookStruct param, out bool handle); //设置钩子 [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(); //得到模块的句柄 [DllImport("kernel32.dll")] private static extern IntPtr GetModuleHandle(string name); //构造器 public KeyboardHookDll() { } /// <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(); } } } /// <summary> /// 取消钩子事件 /// </summary> public void UninstallHook() { if (_hHookValue != 0) { bool ret = UnhookWindowsHookEx(_hHookValue); if (ret) { _hHookValue = 0; } } } /// <summary> /// 钩子事件内部调用,调用_clientMethod方法转发到客户端应用 /// </summary> /// <param name="nCode"></param> /// <param name="wParam"></param> /// <param name="lParam"></param> /// <returns></returns> 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); //1:表示拦截键盘,return 退出 if (handle) { return 1; } } } return CallNextHookEx(_hHookValue, nCode, wParam, lParam); } }
安装键盘勾子
KeyboardHookDll hook = new KeyboardHookDll(); hook.InstallHook(this.OnKeyPress);
客户端键盘捕捉事件
public void OnKeyPress(KeyboardHookDll.HookStruct hookStruct, out bool handle) { handle = false; //预设不拦截任何键 if (hookStruct.vkCode == 27) // 截获ESC { handle = true; //程序后续代码 } }
取消键盘勾子
if (hook != null) { hook.UninstallHook(); }
- c# 键盘勾子
- C#键盘勾子(Hook)拦截器,屏蔽键盘活动
- C#键盘勾子(Hook)拦截器,屏蔽键盘活动
- 深入分析C#键盘勾子(Hook)拦截器,屏蔽键盘活动的详解
- 深入分析C#键盘勾子(Hook)拦截器,屏蔽键盘活动的详解【方便自己学习查阅】
- DELPHI实现键盘勾子
- windows键盘勾子的使用
- WinCE 如何实现键盘勾子
- C#.Net 鼠标和键盘全局监控勾子(hook )
- 键盘勾子匿名方法引起的异常
- c#键盘模拟
- 【转】C#键盘钩子
- c#屏蔽键盘
- c#键盘钩子
- C# 模拟键盘值
- C#键盘记录器
- C#键盘组合键
- C# 模拟键盘值
- 常用的CSS
- USBHID设备报告描述符详解
- oracle的split函数
- xocde4.3 如何手动安装iPhone simulator 4.3/5.0
- 常用的CSS属性
- c# 键盘勾子
- 异常处理
- Linux下面如何进行C语言编程与makefile 初学
- log4j日志级别
- Unix 调试的瑞士军刀:lsof
- 安装低版本GCC方法
- 停机问题
- Transient、Persistent、Detached三个状态
- (Android) Attrs & Style