Windows Hook 学习笔记(2)——键盘挂钩
本例是C#编写的,演示如果设置键盘Hook,拦截键盘按键操作,并返回按键的键值。
本例是C#编写的,演示如果设置键盘Hook,拦截键盘按键操作,并返回按键的键值。
1
using System;2
using System.Runtime.InteropServices;3
using System.Windows.Forms;4

5
namespace Hook6


{7
public partial class Form1 : Form8

{9
public delegate IntPtr HookProc(int nCode, Int32 wParam, IntPtr lParam);10

11

Win32 API#region Win32 API12

13
//设置挂钩14
[DllImport("user32.dll", CharSet = CharSet.Auto, CallingConvention = CallingConvention.StdCall)]15
public static extern IntPtr SetWindowsHookEx(int idHook, HookProc lpfn, IntPtr hInstance, int threadId);16
//调用下一个钩子17
[DllImport("user32.dll", CharSet = CharSet.Auto, CallingConvention = CallingConvention.StdCall)]18
public static extern IntPtr CallNextHookEx(IntPtr idHook, int nCode, Int32 wParam, IntPtr lParam);19
//移除挂钩20
[DllImport("user32.dll", CharSet = CharSet.Auto, CallingConvention = CallingConvention.StdCall)]21
public static extern bool UnhookWindowsHookEx(IntPtr idHook);22
//获取当前进程的编号23
[DllImport("kernel32.dll")]24
public static extern int GetCurrentThreadId();25
//获取按键的状态26
[DllImport("user32")]27
public static extern short GetKeyState(int vKey);28

29
#endregion30

31
private IntPtr hookKeyBoard = IntPtr.Zero;32
private HookProc hpKeyBoard;33
private int WH_KEYBOARD = 2;34

35
public event KeyEventHandler KeyDownEvent;36

37
public Form1()38

{39
InitializeComponent();40

41
hpKeyBoard = new HookProc(KeyboardHookProc);42
//这里设置为拦截当前进程中键盘按键,使用的Hook常数是WH_KEYBOARD(数值为2);43
//GetCurrentThreadId()是当前进程的编号。也可以使用 AppDomain.GetCurrentThreadId(),但在.Net 2.0中已被标示为“过时”。44
//如果要在任何时候都能够拦截按键(不管目前激活的窗口是否是当前进程),就要设置全局Hook,对应的hook常数是 WH_KEYBOARD_LL(数值为13)。45
hookKeyBoard = SetWindowsHookEx(WH_KEYBOARD, hpKeyBoard, (IntPtr)0, GetCurrentThreadId());46

47
this.KeyDownEvent += new KeyEventHandler(Form1_KeyDownEvent);48
}49

50
void Form1_KeyDownEvent(object sender, KeyEventArgs e)51

{52
MessageBox.Show(e.KeyData.ToString());53
}54

55
private IntPtr KeyboardHookProc(int nCode, Int32 wParam, IntPtr lParam)56

{57
bool isPressed = (lParam.ToInt32() & 0x80000000) == 0;58

59
if (nCode < 0 || !isPressed)60

{61
return CallNextHookEx(hookKeyBoard, nCode, wParam, lParam);62
}63

64
if (KeyDownEvent != null && (GetKeyState(wParam) >> 0x10) == 0)65

{66
Keys keyData = (Keys)wParam;67
KeyEventArgs e = new KeyEventArgs(keyData);68
KeyDownEvent(this, e);69
}70
return CallNextHookEx(hookKeyBoard, nCode, wParam, lParam);71
}72

73
private void Form1_FormClosing(object sender, FormClosingEventArgs e)74

{75
UnhookWindowsHookEx(hookKeyBoard);76
hookKeyBoard = IntPtr.Zero;77
}78
}79
}
浙公网安备 33010602011771号