實現一個屬於自己的按鍵精靈


  有點標題黨的感覺~~這東西充其量只能說是按鍵輔助工具,和大名鼎鼎的按鍵精靈比起來實在是小巫見大巫了。

  前兩天放假無聊,天氣太冷不想出門,玩起了很多年前玩過的一款游戲:騎士。太久沒玩,手指靈活度不夠,玩的是一塌糊塗。於是想起了大名鼎鼎的按鍵精靈,下載,寫腳本,再上游戲,解放了雙手的感覺就是不一樣,輕松+愜意。今天是新年上班第一天,比較有空,想起來這件事,秉承重復造輪子的指導方針,經過一下午的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() { }
        }
    }

  


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM