实现一个属于自己的按键精灵
前两天放假无聊,天气太冷不想出门,玩起了很多年前玩过的一款游戏:骑士。太久没玩,手指灵活度不够,玩的是一塌糊涂。于是想起了大名鼎鼎的按键精灵,下载,写脚本,再上游戏,解放了双手的感觉就是不一样,轻松+惬意。今天是新年上班第一天,比较有空,想起来这件事,秉承重复造轮子的指导方针,经过一下午的google,大概功能已经写好,能够满足骑士中战士这个职业最基本的需求.
有点标题党的感觉~~这东西充其量只能说是按键辅助工具,和大名鼎鼎的按键精灵比起来实在是小巫见大巫了。
前两天放假无聊,天气太冷不想出门,玩起了很多年前玩过的一款游戏:骑士。太久没玩,手指灵活度不够,玩的是一塌糊涂。于是想起了大名鼎鼎的按键精灵,下载,写脚本,再上游戏,解放了双手的感觉就是不一样,轻松+惬意。今天是新年上班第一天,比较有空,想起来这件事,秉承重复造轮子的指导方针,经过一下午的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() { }
- }
- }