PPC上应用键盘Hook

using System;
using System.Collections.Generic;
using System.Text;
using System.Runtime.InteropServices;

namespace Key
{
    class Hook
    {
        public delegate int HookKeyProc(int code, IntPtr wParam, IntPtr lParam);
        private HookKeyProc hookKeyDeleg;

        private static int hHookKey = 0;
        public Hook()
        { }
        public methods#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

        protected and private methods#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 == 0x72)//拨打电话键
            {
                   //自己的处理
            //处理完之后一定要返回-1
                return -1
            }

            // 没处理的键的消息往下传递
            return CallNextHookEx(hookKeyDeleg, code, wParam, lParam);

        }

        #endregion

        P/Invoke declarations#region P/Invoke declarations

        [DllImport("coredll.dll")]
        private static extern int SetWindowsHookEx(int type, HookKeyProc HookKeyProc, 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

    }
}

应用时,可以将这个类添加到自己的项目中,在要用的地方直接调用,方法如下:

Hook hk=new Hook();
hk.Start();
hk.Stop();

 

posted on 2012-07-10 11:34  I am Dylan  阅读(300)  评论(0编辑  收藏  举报

导航