刚自学了点c#,对于键盘事件掌握不深,对于hook感兴趣,不知哪位高人给个hook实例,谢谢。

解决方案 »

  1.   

    http://topic.csdn.net/u/20090106/12/8c4c1a5d-4e99-4f3f-b0cd-e1c0129e2a29.html
      

  2.   

     [DllImport("user32.dll", CharSet = CharSet.Auto)]
            public static extern IntPtr SetWindowsHookEx(int hookid, HookProc pfnhook, IntPtr hinst, int threadid);        [DllImport("user32.dll", CharSet = CharSet.Auto, ExactSpelling = true)]
            public static extern bool UnhookWindowsHookEx(IntPtr hhook);     public delegate IntPtr HookProc(int nCode, IntPtr wParam, IntPtr lParam); public enum WindowsHookCodes
        {
            WH_MSGFILTER = (-1),
            WH_JOURNALRECORD = 0,
            WH_JOURNALPLAYBACK = 1,
            WH_KEYBOARD = 2,
            WH_GETMESSAGE = 3,
            WH_CALLWNDPROC = 4,
            WH_CBT = 5,
            WH_SYSMSGFILTER = 6,
            WH_MOUSE = 7,
            WH_HARDWARE = 8,
            WH_DEBUG = 9,
            WH_SHELL = 10,
            WH_FOREGROUNDIDLE = 11,
            WH_CALLWNDPROCRET = 12,
            WH_KEYBOARD_LL = 13,
            WH_MOUSE_LL = 14
        }
     [DllImport("kernel32.dll", ExactSpelling = true, CharSet = CharSet.Auto)]
            public static extern int GetCurrentThreadId();    public class HookMessage
        {
            private IntPtr m_HookEx;
            /// <summary>
            /// 设置自己进程的钩子
            /// </summary>
            /// <param name="p_HookCodes">钩子类型</param>
            public HookMessage(WindowsHookCodes p_HookCodes)
            {
                m_HookEx = SetWindowsHookEx((int)p_HookCodes, new HookProc(SetHookProc), IntPtr.Zero, GetCurrentThreadId());
            }
            /// <summary>
            /// 设置进程的钩子
            /// </summary>
            /// <param name="p_HookCodes">钩子类型</param>
            /// <param name="p_ThreadID">全局钩子</param>
            public HookMessage(WindowsHookCodes p_HookCodes, bool p_Zero)
            {         
                IntPtr _Value =System.Runtime.InteropServices.Marshal.GetHINSTANCE(System.Reflection.Assembly.GetExecutingAssembly().GetModules()[0]);
                m_HookEx = SetWindowsHookEx((int)p_HookCodes, new HookProc(SetHookProc), _Value, 0);
            }
            /// <summary>
            /// 关闭钩子
            /// </summary>
            public void UnHookMessage()
            {
                if (UnhookWindowsHookEx(m_HookEx))
                {
                    m_HookEx = IntPtr.Zero;
                }
            }        public delegate void GetHookMessage(int p_Code, IntPtr p_wParam, IntPtr p_lParam,ref bool p_Send);
            public event GetHookMessage GetHook;        private IntPtr SetHookProc(int p_Code, IntPtr p_wParam, IntPtr p_lParam)
            {
                GC.Collect();
                GC.WaitForPendingFinalizers();
                GC.Collect();
                bool _SendMessage = true;
                if (GetHook != null) GetHook(p_Code, p_wParam, p_lParam, ref _SendMessage);
                if (!_SendMessage) return new IntPtr(1);
                return IntPtr.Zero;
            }
        }把这些放到一个单独的项目里 编译成DLL 调用就可以了..不复杂的.