这篇开始,我开始讲解一下我的界面开发的全部过程,一步一步的讲解开发界面的过程,这 篇主要讲解的是Hook编程,Hook所有的窗体。
Hook,对于大多数程序员来说,这个词并不陌生。对于Windows系统来说,消息Message的传 递贯穿了整个系统,Message简单来说就是一个整数,它具有相应的意义。在C++的winuser.h中 可以看到我们常用的很多的Message。Hook与Message是密不可分的,它的中文解释就是“钩子 ”,就是监控系统中Message的传递,就是在Message传递到最终的Message处理前,对特定的消 息进行处理。
对于Hook来说,开发主要的有3个API函数,均放在User32.dll文件中,这三个函数是:
Hook
1 /// <summary>
2 /// SetWindowsHookEx
3 /// </summary>
4 /// <param name="idHook"></param>
5 /// <param name="lpfn"></param>
6 /// <param name="hMod"></param>
7 /// <param name="dwThreadId"></param>
8 /// <returns></returns>
9 [DllImport("User32.dll", CharSet = CharSet.Auto)]
10 public static extern IntPtr SetWindowsHookEx(int idHook, HookProc lpfn, int hMod, int dwThreadId);
11
12 /// <summary>
13 /// CallNextHookEx
14 /// </summary>
15 /// <param name="hhk"></param>
16 /// <param name="nCode"></param>
17 /// <param name="wParam"></param>
18 /// <param name="lParam"></param>
19 /// <returns></returns>
20 [DllImport("User32.dll", CharSet = CharSet.Auto)]
21 public static extern IntPtr CallNextHookEx(IntPtr hhk, int nCode, IntPtr wParam, IntPtr lParam);
22
23 /// <summary>
24 /// UnhookWindowsHookEx
25 /// </summary>
26 /// <param name="hhk"></param>
27 /// <returns></returns>
28 [DllImport("User32.dll", CharSet = CharSet.Auto)]
29 public static extern bool UnhookWindowsHookEx(IntPtr hhk);
这三个方法分别就是添加Hook,释放Hook和执行下一个Hook。其中的参数就不必介绍了,网 上有很多这方面的资料。接下来就是对Windows窗体的消息截取。
我创建一个项目名称叫做SkinEngines,然后再NativeMethod中添加了这三个方法。其中 SetWindowsHookEx中需要一个参数就是一个方面的名称,在C#中使用委托实现,所以也创建了 一个专门保存委托的地点,放在 Delegates.cs文件中。