c#wince全局钩子(用于键盘监测)

使用时,只需在程序启动时实例化Hook类的一个实例,然后调用start()安装钩子,程序退出时调用stop()拆除钩子.
如 Hook hk = new Hook();
     hk.start();
     hk.stop();

//--------------全局键盘钩子类Hook------------------
using System;
using System.Linq;
using System.Collections.Generic;
using System.Text;
using System.Runtime.InteropServices;
namespace SmartDeviceProject1
{
    public class Hook
    {
        int  hHookKey  ;
        public delegate int HookKeyProc(int code, IntPtr wParam, IntPtr lParam);
        private HookKeyProc hookKeyDeleg;
        public Hook()
        { }
        #region public methods
        //安装钩子
    public void Start()
        {
            if (hHookKey != 0)
            {
                //Unhook the previouse one
                this.Stop();
            }
            hookKeyDeleg = new HookKeyProc(HookKeyProcedure);
            hHookKey = SetWindowsHookEx(WH_KEYBOARD_LL, hookKeyDeleg, GetModuleHandle(null), 0);
            if (hHookKey == 0)
            {
                throw new SystemException("Failed acquiring of the hook.");
            }
        }
        //拆除钩子
    public void Stop()
        {
            UnhookWindowsHookEx(hHookKey);
        }
        #endregion
        #region protected and private methods
        private int HookKeyProcedure(int code, IntPtr wParam, IntPtr lParam)
        {
            KBDLLHOOKSTRUCT hookStruct = (KBDLLHOOKSTRUCT)Marshal.PtrToStructure(lParam, typeof(KBDLLHOOKSTRUCT));
            if (code < 0)
                return CallNextHookEx(hookKeyDeleg, code, wParam, lParam);
            if (hookStruct.vkCode == 0x5B)
            {
                //如果捕捉到VK_LWIN按键
                //......处理......            
                return -1; //返回-1表示已经处理了,不再往下传递
            }
            if (hookStruct.vkCode == 0x25)
            {
                //如果捕捉到VK_LEFT按键
                //......处理......
                 return -1;  
            }        
            // 没处理的键的消息往下传递
       return CallNextHookEx(hookKeyDeleg, code, wParam, lParam);
        }
        #endregion
        #region P/Invoke declarations
        [DllImport("coredll.dll")]
        private static extern int SetWindowsHookEx(int type, HookKeyProc HookKeyProc, IntPtr hInstance, int m);
        //private static extern int SetWindowsHookEx(int type, HookMouseProc HookMouseProc, IntPtr hInstance, int m);
        [DllImport("coredll.dll")]
        private static extern IntPtr GetModuleHandle(string mod);
        [DllImport("coredll.dll")]
        private static extern int CallNextHookEx(
                HookKeyProc hhk,
                int nCode,
                IntPtr wParam,
                IntPtr lParam
                );
        [DllImport("coredll.dll")]
        private static extern int GetCurrentThreadId();
        [DllImport("coredll.dll", SetLastError = true)]
        private static extern int UnhookWindowsHookEx(int idHook);
        private struct KBDLLHOOKSTRUCT
        {
            public int vkCode;
            public int scanCode;
            public int flags;
            public int time;
            public IntPtr dwExtraInfo;
        }
        const int WH_KEYBOARD_LL = 20;
        public class KeyBoardInfo
        {
            public int vkCode;
            public int scanCode;
            public int flags;
            public int time;
        }
        #endregion
    }  
}  

 

posted on 2014-05-16 23:29  IOTer  阅读(589)  评论(0编辑  收藏  举报

导航