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