全局键盘钩子的简单实现
前言
网络上已经有了很多的钩子实现逻辑,这篇文章主要就是写给自己的,并且把所有的代码直接贴出来。
代码
/// <summary>
/// 键盘钩子类
/// </summary>
public class HookKey
{
/// <summary>
/// 钩子的坐标
/// </summary>
public int hHook;
/// <summary>
/// 委托
/// </summary>
HookProc keyBoardHookProcedure;
public delegate int HookProc(int code, int wParam, IntPtr lParam);
/// <summary>
/// 设置钩子起作用
/// </summary>
public void SetHook()
{
keyBoardHookProcedure = new HookProc(MyHookProc);
hHook = SetWindowsHookEx(13, keyBoardHookProcedure, GetModuleHandle(Process.GetCurrentProcess().MainModule.ModuleName), 0);
}
public void UnHook()
{
UnhookWindowsHookEx(hHook);
}
#region 三个必须的方法
[DllImport("user32.dll")]
public static extern int SetWindowsHookEx(int idHook, HookProc lpfn, IntPtr hInstance, int threadId);
[DllImport("user32.dll")]
public static extern int CallNextHookEx(int idHook, int nCode, Int32 wParam, IntPtr lParam);
[DllImport("user32.dll")]
public static extern bool UnhookWindowsHookEx(int idHook);
[DllImport("kernel32.dll", CharSet = CharSet.Auto, CallingConvention = CallingConvention.StdCall)]
private static extern IntPtr GetModuleHandle(string lpModuleName);
[StructLayout(LayoutKind.Sequential)]
class KeyBoardHookStruct
{
/// <summary>
/// 表达一个在1到254间的虚拟键盘码
/// </summary>
public int VkCode { get; set; }
public int Time { get; set; }
public int DwExtraInfo { get; set; }
}
/// <summary>
/// 设置某些键不可用
/// </summary>
/// <param name="code"></param>
/// <param name="wParam"></param>
/// <param name="lParam"></param>
/// <returns></returns>
int MyHookProc(int code, int wParam, IntPtr lParam)
{
KeyBoardHookStruct kbh = (KeyBoardHookStruct)Marshal.PtrToStructure(lParam, typeof(KeyBoardHookStruct));
if (kbh.VkCode == 164 && wParam == 260)
return 1;
if (kbh.VkCode == 165 && wParam == 260)
return 1;
if (kbh.VkCode == 9 && wParam == 256)
return 1;
if (kbh.VkCode == 91 && wParam == 256)
return 1;
return CallNextHookEx(hHook, code, wParam, lParam);
}
}
结束语
代码可以在新建一个类以后直接贴过去使用,可能是需要自己调整一点点内容,我其实也是一知半解,现在就是把代码记录下来,以后可能会完善这些代码