[StructLayout(LayoutKind.Sequential)]
public struct CWPSTRUCT
{
public IntPtr lparam;
public IntPtr wparam;
public int message;
public IntPtr hwnd;
}
//定义委托(钩子函数,用于回调)
public delegate int HookProc(int code, IntPtr wparam, ref CWPSTRUCT cwp); /// <summary>
/// 安装钩子的函数
/// </summary>
/// <param name="type"></param>
/// <param name="hook"></param>
/// <param name="instance"></param>
/// <param name="threadID"></param>
/// <returns></returns>
[DllImport("User32.dll", CharSet = CharSet.Auto)]
public static extern IntPtr SetWindowsHookEx(int type, HookProc hook, IntPtr instance, int threadID); /// <summary>
/// 调用下一个钩子的函数
/// </summary>
/// <param name="hookHandle"></param>
/// <param name="code"></param>
/// <param name="wparam"></param>
/// <param name="cwp"></param>
/// <returns></returns>
[DllImport("User32.dll", CharSet = CharSet.Auto)]
public static extern int CallNextHookEx(IntPtr hookHandle, int code, IntPtr wparam, ref CWPSTRUCT cwp); /// <summary>
/// 卸载钩子
/// </summary>
/// <param name="hookHandle"></param>
/// <returns></returns>
[DllImport("User32.dll", CharSet = CharSet.Auto)]
public static extern bool UnhookWindowsHookEx(IntPtr hookHandle); /// <summary>
/// 获取窗体线程ID
/// </summary>
/// <param name="hwnd">指定窗口句柄</param>
/// <param name="ID">指定一个变量,用于装载拥有那个窗口的一个进程的标识符</param>
/// <returns></returns>
[DllImport("User32.dll", CharSet = CharSet.Auto)]
public static extern int GetWindowThreadProcessId(IntPtr hwnd, int ID); private HookProc hookProc;
private IntPtr hookHandle = IntPtr.Zero;
public const int WM_KILLFOCUS = 0x10; public Form1()
{
InitializeComponent();
//挂接钩子处理方法
this.hookProc = new HookProc(myhookproc);
} /// <summary>
/// 开始拦截
/// </summary>
/// <returns></returns>
private bool StartHook()
{
Form2 f = new Form2();
f.Show();
//安装钩子,拦截系统向Form2发出的消息
this.hookHandle = SetWindowsHookEx(4, hookProc, IntPtr.Zero, GetWindowThreadProcessId(f.Handle, 0));
return (this.hookHandle != IntPtr.Zero);
} /// <summary>
/// 停止拦截
/// </summary>
/// <returns></returns>
private bool StopHook()
{
return UnhookWindowsHookEx(this.hookHandle);
} /// <summary>
/// 钩子处理函数,在这里拦截消息并做处理
/// </summary>
/// <param name="code"></param>
/// <param name="wparam"></param>
/// <param name="cwp"></param>
/// <returns></returns>
private int myhookproc(int code, IntPtr wparam, ref CWPSTRUCT cwp)
{
switch (code)
{
case 0:
switch (cwp.message)
{
case 0xf://WM_PAINT,拦截WM_PAINT消息
MessageBox.Show(code.ToString());
break;
}
break;
}
return CallNextHookEx(hookHandle, code, wparam, ref cwp);
} private void button1_Click(object sender, EventArgs e)
{
StartHook();
timer1.Enabled = true;
} private void timer1_Tick(object sender, EventArgs e)
{
StopHook();
} private void Form1_FormClosing(object sender, FormClosingEventArgs e)
{
StopHook();
}在FORM2里面改变FORM2的背景颜色时,myhookproc 会执行很多次,为什么会这样啊?
public struct CWPSTRUCT
{
public IntPtr lparam;
public IntPtr wparam;
public int message;
public IntPtr hwnd;
}
//定义委托(钩子函数,用于回调)
public delegate int HookProc(int code, IntPtr wparam, ref CWPSTRUCT cwp); /// <summary>
/// 安装钩子的函数
/// </summary>
/// <param name="type"></param>
/// <param name="hook"></param>
/// <param name="instance"></param>
/// <param name="threadID"></param>
/// <returns></returns>
[DllImport("User32.dll", CharSet = CharSet.Auto)]
public static extern IntPtr SetWindowsHookEx(int type, HookProc hook, IntPtr instance, int threadID); /// <summary>
/// 调用下一个钩子的函数
/// </summary>
/// <param name="hookHandle"></param>
/// <param name="code"></param>
/// <param name="wparam"></param>
/// <param name="cwp"></param>
/// <returns></returns>
[DllImport("User32.dll", CharSet = CharSet.Auto)]
public static extern int CallNextHookEx(IntPtr hookHandle, int code, IntPtr wparam, ref CWPSTRUCT cwp); /// <summary>
/// 卸载钩子
/// </summary>
/// <param name="hookHandle"></param>
/// <returns></returns>
[DllImport("User32.dll", CharSet = CharSet.Auto)]
public static extern bool UnhookWindowsHookEx(IntPtr hookHandle); /// <summary>
/// 获取窗体线程ID
/// </summary>
/// <param name="hwnd">指定窗口句柄</param>
/// <param name="ID">指定一个变量,用于装载拥有那个窗口的一个进程的标识符</param>
/// <returns></returns>
[DllImport("User32.dll", CharSet = CharSet.Auto)]
public static extern int GetWindowThreadProcessId(IntPtr hwnd, int ID); private HookProc hookProc;
private IntPtr hookHandle = IntPtr.Zero;
public const int WM_KILLFOCUS = 0x10; public Form1()
{
InitializeComponent();
//挂接钩子处理方法
this.hookProc = new HookProc(myhookproc);
} /// <summary>
/// 开始拦截
/// </summary>
/// <returns></returns>
private bool StartHook()
{
Form2 f = new Form2();
f.Show();
//安装钩子,拦截系统向Form2发出的消息
this.hookHandle = SetWindowsHookEx(4, hookProc, IntPtr.Zero, GetWindowThreadProcessId(f.Handle, 0));
return (this.hookHandle != IntPtr.Zero);
} /// <summary>
/// 停止拦截
/// </summary>
/// <returns></returns>
private bool StopHook()
{
return UnhookWindowsHookEx(this.hookHandle);
} /// <summary>
/// 钩子处理函数,在这里拦截消息并做处理
/// </summary>
/// <param name="code"></param>
/// <param name="wparam"></param>
/// <param name="cwp"></param>
/// <returns></returns>
private int myhookproc(int code, IntPtr wparam, ref CWPSTRUCT cwp)
{
switch (code)
{
case 0:
switch (cwp.message)
{
case 0xf://WM_PAINT,拦截WM_PAINT消息
MessageBox.Show(code.ToString());
break;
}
break;
}
return CallNextHookEx(hookHandle, code, wparam, ref cwp);
} private void button1_Click(object sender, EventArgs e)
{
StartHook();
timer1.Enabled = true;
} private void timer1_Tick(object sender, EventArgs e)
{
StopHook();
} private void Form1_FormClosing(object sender, FormClosingEventArgs e)
{
StopHook();
}在FORM2里面改变FORM2的背景颜色时,myhookproc 会执行很多次,为什么会这样啊?
解决方案 »
免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货