C#.Net的全局键盘钩子(Hook)技术
2006-10-20 15:27
543 查看
///如未特别说明,本人所发表的技术文章都为原创, 任何人引用都请注明出处,并包含本声明 ///作者: CSDN网名hatita,邮件:hatita_qq@hotmail.com,QQ:67913464 ///向无名的开源英雄致敬 2005-03-09
using System; using System.Windows.Forms; using System.Runtime.InteropServices; using System.Reflection;
namespace HookDll { public class HookDll { private KBDLLHOOKSTRUCT kbdllhs; private IntPtr iHookHandle =IntPtr.Zero; private GCHandle _hookProcHandle; public delegate IntPtr HookProc(int nCode, IntPtr wParam, IntPtr lParam);
[DllImport("user32.dll", CharSet=CharSet.Auto)] public static extern IntPtr SetWindowsHookEx(int hookid, HookProc pfnhook, IntPtr hinst, int threadid); [DllImport("user32.dll", CharSet=CharSet.Auto, ExactSpelling=true)] public static extern bool UnhookWindowsHookEx(IntPtr hhook); [DllImport("user32.dll", CharSet=CharSet.Auto, ExactSpelling=true)] public static extern IntPtr CallNextHookEx(IntPtr hhook, int code, IntPtr wparam, IntPtr lparam);
[DllImport("kernel32.dll",CharSet=CharSet.Auto, CallingConvention=CallingConvention.StdCall)] private static extern IntPtr GetModuleHandle(string lpModuleName);
[DllImport("Kernel32.dll",EntryPoint="RtlMoveMemory")] public static extern void CopyMemory (ref KBDLLHOOKSTRUCT Source,IntPtr Destination,int Length);
private const int WH_KEYBOARD = 13; public void DisableKBDHook() { try { if (iHookHandle!=IntPtr.Zero) { UnhookWindowsHookEx(iHookHandle); } _hookProcHandle.Free(); iHookHandle = IntPtr.Zero; } catch { return; } }
public void EnableKBDHook() { HookProc hookProc = new HookProc(KBDDelegate); _hookProcHandle = GCHandle.Alloc(hookProc); iHookHandle = SetWindowsHookEx(WH_KEYBOARD, hookProc, GetModuleHandle("HookDll.dll"), 0);
if (iHookHandle == IntPtr.Zero) { throw new System.Exception("错误,钩子失败!"); } }
public IntPtr KBDDelegate(int iCode , IntPtr wParam,IntPtr lParam) { kbdllhs = new KBDLLHOOKSTRUCT(); CopyMemory(ref kbdllhs, lParam, 20); //结果就在这里了^_^ int iHookCode = kbdllhs.vkCode;
DisableKBDHook(); EnableKBDHook(); return CallNextHookEx(iHookHandle, iCode, wParam,lParam); } }
[StructLayout(LayoutKind.Sequential)] public struct KBDLLHOOKSTRUCT { public int vkCode; public int scanCode; public int flags; public int time; public int dwExtraInfo; } }
相关文章推荐
- C#.Net的全局键盘钩子(Hook)技术
- 转自sgear博客:C#.Net的全局键盘钩子(Hook)技术
- C#.Net的全局键盘钩子(Hook)技术
- C#.Net 鼠标和键盘全局监控勾子(hook )
- VB.NET全局键盘鼠标钩子 [Vb.Net Hook](修正版)
- VB.NET全局键盘鼠标钩子 [Vb.Net Hook](修正版)
- HOOK技术--键盘鼠标钩子实例
- [C#.net]如何解决安装系统全局钩子程序调试时失败的问题
- 在C#中使用全局鼠标、键盘Hook
- C#全局键盘钩子
- c# 钩子(hook)键盘
- HOOK技术--键盘鼠标钩子实例
- HOOK使用:全局键盘钩子
- 基于C#实现的HOOK键盘钩子实例代码
- 如何在C#中使用全局鼠标、键盘Hook
- 用钩子(hook)实现C#的屏幕键盘效果
- 如何在C#中使用全局鼠标、键盘Hook
- HOOK使用:全局键盘钩子
- HOOK技术--键盘鼠标钩子实例
- C#使用全局钩子(hook),SetWindowsHookEx返回0、不回调的解决