曾经有一段时间特别迷恋外挂程序,所以有所了解,但仅限于皮毛,因为缺少的知识太多就放弃了,最近有个私活须要用到钩子,因此重行来研究一番,其实也谈不上研究,我是一个C#程序员,原本就没有多少系统的知识(并非每一个C#程序员都是这样),使用win32 api对我来讲仍是有些困难的,因此不能给出多么高深的讲解,这里仅限于我是如何使用C#调用win32 api来实现系统钩子的。
什么是钩子程序员
我不以为本身能说清楚什么是钩子,因此我推荐你们看一些 钩子简介windows
项目需求:api
实现一个程序来禁用全部鼠标按键,禁用任务管理器,禁用注册表等。
涉及Win32 API函数
代码实现ui
要使用钩子首先咱们得有一个钩子url
个人钩子代码
```CSharp
//定义个委托类型,由于设置钩子的时候须要这种类型的委托实现
private delegate int HookProc(int nCode,IntPtr wparam,ref IntPtr lparam);线程
设置钩子到系统的钩子链中code
SetWindowsHookEx的定义的参数:设置钩子代码
CSharp //定义一个钩子实例 var hookProc = new HookProc(HookProcCallback); //设置钩子 hKeyboardHook = SetWindowsHookEx(WH_KEYBOARD_LL, proc, null, 0); if(hkeyboardHook!=IntPtr.Zero){ //设置成功 }
进程
public class Hook { // 设置钩子 [DllImport("user32.dll", CharSet = CharSet.Auto, SetLastError = true)] public static extern IntPtr SetWindowsHookEx(int idHook, HookHandlerDelegate lpfn, IntPtr hmod, uint dwThreadID); // 卸载钩子 [DllImport("user32.dll")] public static extern bool UnhookWindowsHookEx(IntPtr idHook); // 获取模块句柄 [DllImport("kernel32.dll", CharSet = CharSet.Auto, SetLastError = true)] public static extern IntPtr GetModuleHandle(String modulename); public const int WM_KEYDOWN = 0x0100; public const int WH_KEYBOARD_LL = 13; public const int WM_SYSKEYDOWN = 0x0104; public struct KBDLLHOOKSTRUCT { public int vkCode; public int scanCode; public int flags; public int time; public int dwExtraInfo; } public delegate int HookHandlerDelegate(int nCode, IntPtr wparam, ref KBDLLHOOKSTRUCT lparam); //钩子回掉委托实例 private static HookHandlerDelegate proc; //钩子句柄 private static IntPtr hKeyboardHook; private static int HookCallback(int nCode, IntPtr wparam, ref KBDLLHOOKSTRUCT lparam) { if ( nCode >= 0 && (wparam == (IntPtr)WM_KEYDOWN || wparam == (IntPtr)WM_SYSKEYDOWN) ) { if (lparam.vkCode == 91 || lparam.vkCode == 164 || lparam.vkCode == 9 || lparam.vkCode == 115) { return 1; } else { return 0; } } return 0; } public static void HookStart() { if (hKeyboardHook == IntPtr.Zero) { // 建立HookProc实例 proc = new HookHandlerDelegate(HookCallback); using (Process curPro = Process.GetCurrentProcess()) using (ProcessModule curMod = curPro.MainModule) { //定义全局钩子 hKeyboardHook = SetWindowsHookEx(WH_KEYBOARD_LL, proc,GetModuleHandle(curMod.FileName), 0); } if (hKeyboardHook == IntPtr.Zero) { HookStop(); throw new Exception("钩子设置失败"); } } } public static void HookStop() { bool retKeyboard = true; if (hKeyboardHook != IntPtr.Zero) { retKeyboard = UnhookWindowsHookEx(hKeyboardHook); hKeyboardHook = IntPtr.Zero; } if (!(retKeyboard)) throw new Exception("卸载钩子失败"); } }