[ 来源:http://www.it55.com | 作者: | 时间:2008-01-11 | 收藏 | 推荐 ] 【大 中 小】
}
return CallNextHookEx(m_hook, code, wParam, lParam);
}在这个事件中可以取得消息的参数,特别是按键的值,然后通过HookInvoked委托调用事件实际的处理程序
四、在应用程序中调用钩子类
我们可以在自己的form中声明两个钩子对象
private MyHook callProcHook = new MyHook(HookType.WH_CALLWNDPROC);
private MyHook keyHook = new MyHook(HookType.WH_KEYBOARD);
然后在初始化时注册钩子:
private void Form1_Load(object sender, EventArgs e)
{
keyHook.HookInvoked += new HookEventHandler(keyHook_HookInvoked);
keyHook.Install();
callProcHook.HookInvoked += new HookEventHandler(callProcHook_HookInvoked);
callProcHook.Install();
}
然后就是实际的钩子事件:
private void keyHook_HookInvoked(object sender, HookEventArgs e)
{
if (e.key == Keys.F4 && e.bAltKey) //Alt + F4
{
this.WindowState = FormWindowState.Minimized;
}
}
private void callProcHook_HookInvoked(object sender, HookEventArgs e)
{
unsafe
{
CWPSTRUCT* message = (CWPSTRUCT*)e.lParam;
if (message != null)
{
if (message->message == WM_CLOSE)
{
(sender as MyHook).CallNextProc = false;
MessageBox.Show("程序即将关闭!");
}
}
}
}
这样我们就可以通过钩子实现一些相对底层的应用。
代码说的有点乱,我就把最主要的代码直接列在下面供大家参考:
例子代码
1using System;
2using System.Collections.Generic;
3using System.ComponentModel;
4using System.Data;
5using System.Drawing;
6using System.Text;
7using System.Windows.Forms;
8using System.Runtime.InteropServices;
9
10namespace HookTest
11{
12 public partial class Form1 : Form
13 {
14 消息定义(WinUser.h中定义)#region 消息定义(WinUser.h中定义)
15 private const int WM_PAINT = 0x000F;
16 private const int WM_CLOSE = 0x0010;
17 private const int WM_QUIT = 0x0012;
18 private const int WM_DESTROY = 0x0002;
19 #endregion
20
21 private MyHook callProcHook = new MyHook(HookType.WH_CALLWNDPROC);
22 private MyHook keyHook = new MyHook(HookType.WH_KEYBOARD);
23
24 public Form1()
25 {
26 InitializeComponent();
27 }
28
29 private void Form1_Load(object sender, EventArgs e)
30 {
31 keyHook.HookInvoked += new HookEventHandler(keyHook_HookInvoked);
32 keyHook.Install();
33
34 callProcHook.HookInvoked += new HookEventHandler(callProcHook_HookInvoked);
35 callProcHook.Install();
36 }
37
38 private void keyHook_HookInvoked(object sender, HookEventArgs e)
39 {
40 if (e.key == Keys.F4 && e.bAltKey) //Alt + F4
41 {
42 this.WindowState = FormWindowState.Minimized;
43 }
44 }
45
46 private void callProcHook_HookInvoked(object sender, HookEventArgs e)
47 {
48 unsafe
49 {
50 CWPSTRUCT* message = (CWPSTRUCT*)e.lParam;
51 if (message != null)
52 {
53 if (message->message == WM_CLOSE)
54 {
55 (sender as MyHook).CallNextProc = false;
56 MessageBox.Show("程序即将关闭!");
57 }
58 }
59 }
60 }
61
62 }
63
64 消息结构体(参照WinUser.h中定义)#region 消息结构体(参照WinUser.h中定义)
65 public struct CWPSTRUCT
66 {
67 public IntPtr lparam;
68 public IntPtr wparam;
69 public int message;
70 public IntPtr hwnd;
(编辑:IT资讯之家 www.it55.com)