1、钩操作类
public class KeyPressSender {
[StructLayout(LayoutKind.Sequential)] public class KeyBoardHookStruct {
public int vkCode; public int scanCode; public int flags; public int time; public int dwExtraInfo; } //事件输出 public event KeyEventHandler KeyUpEvent; //委托 public delegate int HookProc(int nCode, int wParam, IntPtr lParam); static int hHook = 0; public const int WH_KEYBOARD_LL = 13; //LowLevel如果是的话,键盘截获WH_KEYBOARD=2,不能截取系统键盘,Acrobat Reader键盘将在你截取之前获得。 static HookProc KeyBoardHookProcedure; //设置钩子 [DllImport("user32.dll")] public static extern int SetWindowsHookEx(int idHook, HookProc lpfn, IntPtr hInstance, int threadId); [DllImport("user32.dll", CharSet = CharSet.Auto, CallingConvention = CallingConvention.StdCall)] //去掉钩子 public static extern bool UnhookWindowsHookEx(int idHook); [DllImport("user32.dll")] //调用下一个钩子 public static extern int CallNextHookEx(int idHook, int nCode, int wParam, IntPtr lParam); [DllImport("kernel32.dll")] public static extern int GetCurrentThreadId(); [DllImport("kernel32.dll")] public static extern IntPtr GetModuleHandle(string name); public void Hook_Start() {
if (hHook == 0) {
KeyBoardHookProcedure = new HookProc(KeyBoardHookProc); hHook = SetWindowsHookEx(WH_KEYBOARD_LL, KeyBoardHookProcedure, GetModuleHandle(Process.GetCurrentProcess().MainModule.ModuleName), 0); //如果设置钩子失败. if (hHook == 0) {
Hook_Clear(); } } } /// <summary> /// 取消钩子事件 /// </summary> public void Hook_Clear() {
bool retKeyboard = true; if (hHook != 0) {
retKeyboard = UnhookWindowsHookEx(hHook); hHook = 0; } } public int KeyBoardHookProc(int nCode, int wParam, IntPtr lParam) {
if (nCode >= 0) {
KeyBoardHookStruct kbh = (KeyBoardHookStruct)Marshal.PtrToStructure(lParam, typeof(KeyBoardHookStruct)); Keys KeyData = (Keys)Enum.Parse(typeof(Keys), kbh.vkCode.ToString()); // 键盘抬起 if (KeyUpEvent != null)/* && wParam == WM_KEYUP)*/ {
//Keys keyData = (Keys)MyKeyboardHookStruct.vkCode; //if (keyData == Keys.Up) //{
KeyEventArgs e = new KeyEventArgs(KeyData);//绑定事件 KeyUpEvent(this, e); //MessageBox.Show("捕捉到了按键释放"); //} } #region 数据操作 //switch (k) //{
// case Keys.F2: // if (kbh.flags == 0) // {
// // } // else if (kbh.flags == 128) // {
// //放开后做什么事 // } // return 1; //} #endregion } return CallNextHookEx(hHook, nCode, wParam, lParam); } }
2 引用方法:
创建事件与实例化
private KeyEventHandler myKeyEventHandeler = null;//按键钩子
//private KeyboardHook k_hook = new KeyboardHook();
private KeyPressSender k_hook = new KeyPressSender();
初始化需要挂接事件
myKeyEventHandeler = new KeyEventHandler(hook_KeyUp);
k_hook.KeyUpEvent += myKeyEventHandeler;//钩住键按下
k_hook.Hook_Start();//安装键盘钩子
获取键盘输入后操作的方法
private void hook_KeyUp(object sender, KeyEventArgs e)
{
// 这里写具体实现
string Log = $"按下了键盘 {e.KeyCode},并已触发。";
Common.LogWrite.WriteLog(Log);
string PressKeyData = e.KeyCode.ToString().ToUpper();
}
关闭钩子
k_hook.Hook_Clear();//卸载键盘钩子