实现一个属于自己的按键精灵

  有点标题党的感觉~~这东西充其量只能说是按键辅助工具,和大名鼎鼎的按键精灵比起来实在是小巫见大巫了。

  前两天放假无聊,天气太冷不想出门,玩起了很多年前玩过的一款游戏:骑士。太久没玩,手指灵活度不够,玩的是一塌糊涂。于是想起了大名鼎鼎的按键精灵,下载,写脚本,再上游戏,解放了双手的感觉就是不一样,轻松+惬意。今天是新年上班第一天,比较有空,想起来这件事,秉承重复造轮子的指导方针,经过一下午的google,大概功能已经写好,能够满足骑士中战士这个职业最基本的需求。以下是代码:

    public class hook

    {

        // Fields

        private static int hHook;

        private HookProc KeyBoardHookProcedure;



        static Dictionary<string, Thread> dict = new Dictionary<string, Thread>();



        // Methods

        static hook() { }

        public hook() { }

        [DllImport("user32.dll", CharSet = CharSet.Auto, ExactSpelling = true)]

        public static extern IntPtr GetForegroundWindow();

        [DllImport("user32.dll", CallingConvention = CallingConvention.StdCall, CharSet = CharSet.Auto)]

        public static extern int CallNextHookEx(int idHook, int nCode, IntPtr wParam, IntPtr lParam);

        [DllImport("USER32.DLL")]

        public static extern IntPtr FindWindow(string lpClassName, string lpWindowName);

        [DllImport("kernel32.dll", CallingConvention = CallingConvention.StdCall, CharSet = CharSet.Auto)]

        private static extern IntPtr GetModuleHandle(string lpModuleName);

        public void Hook_Clear()

        {

            bool flag = true;

            if (hHook != 0)

            {

                flag = UnhookWindowsHookEx(hHook);

                hHook = 0;

            }

            if (!flag)

            {

                throw new Exception("取消hook失败!");

            }

        }

        public void Hook_Start()

        {

            if (hHook == 0)

            {

                this.KeyBoardHookProcedure = new HookProc(hook.KeyBoardHookProc);

                hHook = SetWindowsHookEx(13, this.KeyBoardHookProcedure, GetModuleHandle(Process.GetCurrentProcess().MainModule.ModuleName), 0);

                if (hHook == 0)

                {

                    MessageBox.Show("设置Hook失败!");

                    this.Hook_Clear();

                }

            }

        }

        [DllImport("User32.dll")]

        public static extern void keybd_event(byte bVk, byte bScan, int dwFlags, int dwExtraInfo);



        public static void 战士抖杀()

        {

            while (true)

            {

                byte num1 = (byte)Keys.E;

                keybd_event(num1, 0, 0, 0);

                Thread.Sleep(100);

                keybd_event(num1, 0, 2, 0);

                Thread.Sleep(100);

                keybd_event(num1, 0, 0, 0);

                Thread.Sleep(100);

                keybd_event(num1, 0, 2, 0);

                Thread.Sleep(100);

                byte num2 = (byte)Keys.D4;

                keybd_event(num2, 0, 0, 0);

                Thread.Sleep(100);

                keybd_event(num2, 0, 2, 0);

                Thread.Sleep(100);

                keybd_event(num1, 0, 0, 0);

                Thread.Sleep(100);

                keybd_event(num1, 0, 2, 0);

                Thread.Sleep(100);

                keybd_event(num1, 0, 0, 0);

                Thread.Sleep(100);

                keybd_event(num1, 0, 2, 0);

                Thread.Sleep(100);

                byte num4 = (byte)Keys.R;

                keybd_event(num4, 0, 0, 0);

                Thread.Sleep(100);

                keybd_event(num4, 0, 2, 0);

                Thread.Sleep(100);

            }

        }



        public static int KeyBoardHookProc(int nCode, IntPtr wParam, IntPtr lParam)

        {

            KeyBoardHookStruct input = (KeyBoardHookStruct)Marshal.PtrToStructure(lParam, typeof(KeyBoardHookStruct));



            if (input.vkCode == (int)Keys.F11)

            {

                IntPtr ptr = GetForegroundWindow();

                if (ptr != IntPtr.Zero)

                {

                    if (dict.Count < 1)

                    {

                        ThreadStart threadStart = new ThreadStart(战士抖杀);

                        Thread thread = new Thread(threadStart);

                        thread.Start();

                        dict.Clear();

                        dict.Add("战士抖杀", thread);

                    }

                }

                return 1;

            }

            else if (input.vkCode == (int)Keys.F12)

            {

                foreach (var th in dict)

                {

                    Thread thread = th.Value;

                    if (thread != null && thread.IsAlive)

                    {

                        if (!thread.Join(3))

                        {

                            thread.Abort();

                        }

                    }

                }

                dict.Clear();

            }

            return CallNextHookEx(hHook, nCode, wParam, lParam);

        }

        [DllImport("USER32.DLL")]

        public static extern bool SetForegroundWindow(IntPtr hWnd);

        [DllImport("user32.dll", CallingConvention = CallingConvention.StdCall, CharSet = CharSet.Auto)]

        public static extern int SetWindowsHookEx(int idHook, HookProc lpfn, IntPtr hInstance, int threadId);

        [DllImport("user32.dll", CallingConvention = CallingConvention.StdCall, CharSet = CharSet.Auto)]

        public static extern bool UnhookWindowsHookEx(int idHook);



        // Nested Types

        public delegate int HookProc(int nCode, IntPtr wParam, IntPtr lParam);



        [StructLayout(LayoutKind.Sequential)]

        public class KeyBoardHookStruct

        {

            public int vkCode;

            public int scanCode;

            public int flags;

            public int time;

            public int dwExtraInfo;

            public KeyBoardHookStruct() { }

        }

    }

  

你可能感兴趣的:(实现)