目前的程序中想要添加Hook,截获键盘按键消息,所以上网找了一下关于C#下Hook的东西。发现很多人都在说在C#中添加Hook不成功和不稳定,而建议使用C++封一个Dll给C#使用。C#中实现Hook,可喜的是最后我还是成功的在程序中使用C#添加了Hook,经过测试还是没有什么问题的。
进行Hook需要使用三个API函数
SetWindowsHookEx  进行Hook的注册
UnhookWindowsHookEx  取消已经注册的Hook
CallNextHookEx  将消息传递给下一个Hook函数

看一下定义

 1C#中实现Hook        [DllImport("user32.dll")]
 2C#中实现Hook        private static extern IntPtr SetWindowsHookEx(
 3C#中实现Hook            HookType code, HookProc func, IntPtr instance, int threadID);
 4C#中实现Hook
 5C#中实现Hook        [DllImport("user32.dll")]
 6C#中实现Hook        private static extern int UnhookWindowsHookEx(IntPtr hook);
 7C#中实现Hook
 8C#中实现Hook        [DllImport("user32.dll")]
 9C#中实现Hook        private static extern int CallNextHookEx(
10C#中实现Hook            IntPtr hook, int code, IntPtr wParam, ref KBDLLHOOKSTRUCT lParam);

我们需要定义一个delegate来接收消息
1C#中实现Hook        private delegate int HookProc(int code, IntPtr wParam, ref KBDLLHOOKSTRUCT lParam);

定义两个event提供给外界使用
1C#中实现Hook        public delegate void HookEventHandler(object sender, HookEventArgs e);
2C#中实现Hook        public event HookEventHandler KeyDown;
3C#中实现Hook        public event HookEventHandler KeyUp;
4C#中实现Hook

因为要接收的是键盘的消息所以要定义一些消息,和我们要接收的结构。
 1C#中实现Hook    public class HookEventArgs : EventArgs
 2    }

 1C#中实现Hook        private enum HookType : int
 2        }

关键的在这里 注册Hook
 1C#中实现Hook        private void Install()
 2        }
哦,还有HookType _hookType = HookType.WH_KEYBOARD_LL; 因为要截获键盘消息
还有_hookFunction = new HookProc(HookCallback);
其实最关键的是Marshal.GetHINSTANCE(list[0])得到当前程序的instance,这样这个Hook就是全局的Hook,这个位置也可以是null,这样就不是全局Hook。
有个很奇怪的现象就是这个函数,在调试状态执行不能成功,而做成Release以后运行成功,所以你在做程序时,不要因为调试失败而对这个函数有怀疑,编一个Release版本的程序,独立运行再试一下。我使用的环境是VS2005 + Vista。

接收消息的函数
 1C#中实现Hook        private int HookCallback(int code, IntPtr wParam, ref KBDLLHOOKSTRUCT lParam)
 2        }
这里会区分KeyUp和KeyDown,注意一定要调用CallNextHookEx,这样会将这个消息在系统中继续传递,这很重要。除非你想阻止这个消息,也不希望其他程序再处理这个消息。

下面最后的操作,释放注册。
1C#中实现Hook        private void Uninstall()
2        }

Ok,完成了。

相关文章:

  • 2022-12-23
  • 2021-12-23
  • 2021-04-07
  • 2022-01-18
  • 2022-01-21
  • 2021-11-27
  • 2022-12-23
猜你喜欢
  • 2022-12-23
  • 2021-06-20
  • 2022-12-23
  • 2021-09-23
  • 2021-10-14
  • 2022-02-01
  • 2021-10-19
相关资源
相似解决方案