c#键盘钩子全解
来源:互联网 发布:centos samba 配置 编辑:程序博客网 时间:2024/05/18 02:01
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 util{ public class 键盘钩子类 { //使用方法 //private键盘钩子类hook = new 键盘钩子类(); //hook.InstallHook(this.拦截函数); //public void 拦截函数(键盘钩子类.鼠标信息结构体 hookStruct,out bool handle){}; //if(hook!=null) hook.UninstallHook(); //定义常量 public const int WH_KEYBOARD_LL = 13; //全局钩子键盘为13,线程钩子键盘为2 public const int WM_KEYDOWN = 0X0100; //键按下0x0101为键弹起 public static int WM_KEYUP = 0x0101; public const int WM_SYSKEYDOWN = 0X0104; //键盘处理事件委托 ,当捕获键盘输入时调用定义该委托的方法.(定义函数指针) public delegate int HookHandle(int nCode, int wParam, IntPtr lParam); //客户端键盘处理事件 public delegate void 调用端函数(信息结构体 param, out bool handle); //接收SetWindowsHookEx返回值 private static int 是否以安装 = 0; //声明一个指向执行函数的函数指针 private HookHandle 执行函数引用; //定义存储按键信息的结构体 [StructLayout(LayoutKind.Sequential)] public class 信息结构体 { public int vkCode; public int scanCode; public int flags; public int time; public int dwExtraInfo; } //设置钩子 //idHook为13代表键盘钩子为14代表鼠标钩子,lpfn为函数指针,指向需要执行的函数,hInstance为指向进程块的指针,threadId默认为0就可以了 [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 进程块 = IntPtr.Zero; //构造器 public 键盘钩子类() { } //外部调用的键盘处理事件 private static 调用端函数 调用函数引用 = null; /// <summary> /// 安装勾子 /// </summary> /// <param name="hookProcess">外部调用的键盘处理事件</param> public void InstallHook(调用端函数 clientMethod) { 调用函数引用 = clientMethod; // 安装键盘钩子 if (是否以安装 == 0) { 执行函数引用 = new HookHandle(执行函数); 进程块 = GetModuleHandle(Process.GetCurrentProcess().MainModule.ModuleName); 是否以安装 = SetWindowsHookEx(WH_KEYBOARD_LL,执行函数引用,进程块,0); //如果设置钩子失败. if (是否以安装 == 0) UninstallHook(); } } //取消钩子事件 public void UninstallHook() { if (是否以安装 != 0) { bool ret = UnhookWindowsHookEx(是否以安装); if (ret) 是否以安装 = 0; } } //钩子事件内部调用,调用_clientMethod方法转发到客户端应用。 private static int 执行函数(int nCode, int wParam, IntPtr lParam) { if (nCode >= 0 && (wParam == (int)WM_SYSKEYDOWN) || (wParam == (int)WM_KEYDOWN)) { //转换结构 信息结构体 hookStruct = (信息结构体)Marshal.PtrToStructure(lParam, typeof(信息结构体)); if (调用函数引用 != null) { bool handle = false; //默认不拦截 //调用客户提供的事件处理程序。 调用函数引用(hookStruct, out handle); if (handle) return 1; //1:表示拦截键盘,return 退出 } } return CallNextHookEx(是否以安装, nCode, wParam, lParam); } }}
阅读全文
2 0
- c#键盘钩子全解
- c#鼠标钩子全解
- 【转】C#键盘钩子
- c#键盘钩子
- c# wince 键盘钩子
- c# wince 键盘钩子
- c# wince 键盘钩子
- C#之键盘钩子
- C#鼠标键盘钩子
- C# 键盘钩子
- C#全局键盘钩子
- C#全局键盘钩子
- C# 键盘钩子入门
- c#键盘钩子
- C# winform键盘钩子
- C#键盘鼠标钩子
- c# 钩子(hook)键盘
- C#键盘钩子
- 第12天
- 《高质量 C++/C 编程指南 》阅读笔记(二)
- 0811 钟 区间第K大(kth)
- Eclipse快捷键大全
- XYNUOJ 问题 H: 统计难题
- c#键盘钩子全解
- Find All Anagrams in a String
- Vue—cli VUE官方提供的脚手架工具
- 键盘录入一个文件夹路径,统计该文件夹(包含子文件夹)中每种类型的文件及个数
- Shiro
- 在Windows下 python2.7安装scrapy
- c#进程操作-sendmessage全解
- 【SSLGZ 2674】2017年8月9日提高组T2 覆盖
- CSS3+js 简易时钟