[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 会执行很多次,为什么会这样啊?