最新玩了一下上學時候玩的游戲,但游戲里面變化太多了,進去后等級就很高,要不停地點擊鼠標加技能。
所以利用工作中常用的C#調用 API不停地點擊鼠標。
如圖:
為方便在基礎上修改,我把整個解決方案放到百度雲盤。以下為鏈接:
鏈接: http://pan.baidu.com/s/1o7t80bS 密碼: pehi
先將用到的公用方法貼上來:
1 using System; 2 using System.Collections.Generic; 3 using System.Diagnostics; 4 using System.Runtime.InteropServices; 5 using System.Text; 6 using System.Windows.Forms; 7 8 namespace AutoKeyTool 9 { 10 public class KeyboardHook 11 { 12 int hHook; 13 Win32Api.HookProc KeyboardHookDelegate; 14 public event KeyEventHandler OnKeyDownEvent; 15 public event KeyEventHandler OnKeyUpEvent; 16 public event KeyPressEventHandler OnKeyPressEvent; 17 18 public KeyboardHook() { } 19 public void SetHook() 20 { 21 KeyboardHookDelegate = new Win32Api.HookProc(KeyboardHookProc); 22 Process cProcess = Process.GetCurrentProcess(); 23 ProcessModule cModule = cProcess.MainModule; 24 var mh = Win32Api.GetModuleHandle(cModule.ModuleName); 25 hHook = Win32Api.SetWindowsHookEx(Win32Api.WH_KEYBOARD_LL, KeyboardHookDelegate, mh, 0); 26 } 27 28 public void UnHook() 29 { 30 Win32Api.UnhookWindowsHookEx(hHook); 31 } 32 33 private List<Keys> preKeysList = new List<Keys>();//存放被按下的控制鍵,用來生成具體的鍵 34 private int KeyboardHookProc(int nCode, Int32 wParam, IntPtr lParam) 35 { 36 //如果該消息被丟棄(nCode<0)或者沒有事件綁定處理程序則不會觸發事件 37 if ((nCode >= 0) && (OnKeyDownEvent != null || OnKeyUpEvent != null || OnKeyPressEvent != null)) 38 { 39 Win32Api.KeyboardHookStruct KeyDataFromHook = (Win32Api.KeyboardHookStruct)Marshal.PtrToStructure(lParam, typeof(Win32Api.KeyboardHookStruct)); 40 Keys keyData = (Keys)KeyDataFromHook.vkCode; 41 //按下控制鍵 42 if ((OnKeyDownEvent != null || OnKeyPressEvent != null) && (wParam == Win32Api.WM_KEYDOWN || wParam == Win32Api.WM_SYSKEYDOWN)) 43 { 44 if (IsCtrlAltShiftKeys(keyData) && preKeysList.IndexOf(keyData) == -1) 45 { 46 preKeysList.Add(keyData); 47 } 48 } 49 //WM_KEYDOWN和WM_SYSKEYDOWN消息,將會引發OnKeyDownEvent事件 50 if (OnKeyDownEvent != null && (wParam == Win32Api.WM_KEYDOWN || wParam == Win32Api.WM_SYSKEYDOWN)) 51 { 52 KeyEventArgs e = new KeyEventArgs(GetDownKeys(keyData)); 53 OnKeyDownEvent(this, e); 54 } 55 56 //WM_KEYDOWN消息將引發OnKeyPressEvent 57 58 if (OnKeyPressEvent != null && wParam == Win32Api.WM_KEYDOWN) 59 { 60 byte[] keyState = new byte[256]; 61 Win32Api.GetKeyboardState(keyState); 62 byte[] inBuffer = new byte[2]; 63 if (Win32Api.ToAscii(KeyDataFromHook.vkCode, KeyDataFromHook.scanCode, keyState, inBuffer, KeyDataFromHook.flags) == 1) 64 { 65 KeyPressEventArgs e = new KeyPressEventArgs((char)inBuffer[0]); 66 OnKeyPressEvent(this, e); 67 } 68 } 69 70 //松開控制鍵 71 if ((OnKeyDownEvent != null || OnKeyPressEvent != null) && (wParam == Win32Api.WM_KEYUP || wParam == Win32Api.WM_SYSKEYUP)) 72 { 73 if (IsCtrlAltShiftKeys(keyData)) 74 { 75 for (int i = preKeysList.Count - 1; i >= 0; i--) 76 { 77 if (preKeysList[i] == keyData) { preKeysList.RemoveAt(i); } 78 } 79 } 80 } 81 82 //WM_KEYUP和WM_SYSKEYUP消息,將引發OnKeyUpEvent事件 83 if (OnKeyUpEvent != null && (wParam == Win32Api.WM_KEYUP || wParam == Win32Api.WM_SYSKEYUP)) 84 { 85 KeyEventArgs e = new KeyEventArgs(GetDownKeys(keyData)); 86 OnKeyUpEvent(this, e); 87 } 88 } 89 return Win32Api.CallNextHookEx(hHook, nCode, wParam, lParam); 90 91 } 92 93 //根據已經按下的控制鍵生成key 94 private Keys GetDownKeys(Keys key) 95 { 96 Keys rtnKey = Keys.None; 97 foreach (Keys i in preKeysList) 98 { 99 if (i == Keys.LControlKey || i == Keys.RControlKey) { rtnKey = rtnKey | Keys.Control; } 100 if (i == Keys.LMenu || i == Keys.RMenu) { rtnKey = rtnKey | Keys.Alt; } 101 if (i == Keys.LShiftKey || i == Keys.RShiftKey) { rtnKey = rtnKey | Keys.Shift; } 102 } 103 return rtnKey | key; 104 } 105 private Boolean IsCtrlAltShiftKeys(Keys key) 106 { 107 if (key == Keys.LControlKey || key == Keys.RControlKey || key == Keys.LMenu || key == Keys.RMenu || key == Keys.LShiftKey || key == Keys.RShiftKey) { return true; } 108 return false; 109 } 110 } 111 }
1 using System; 2 using System.Collections.Generic; 3 using System.Runtime.InteropServices; 4 using System.Text; 5 6 namespace AutoKeyTool 7 { 8 public class MouseHook 9 { 10 //結構體布局 本機位置 11 [StructLayout(LayoutKind.Sequential)] 12 struct NativeRECT 13 { 14 public int left; 15 public int top; 16 public int right; 17 public int bottom; 18 } 19 20 //將枚舉作為位域處理 21 [Flags] 22 enum MouseEventFlag : uint //設置鼠標動作的鍵值 23 { 24 Move = 0x0001, //發生移動 25 LeftDown = 0x0002, //鼠標按下左鍵 26 LeftUp = 0x0004, //鼠標松開左鍵 27 RightDown = 0x0008, //鼠標按下右鍵 28 RightUp = 0x0010, //鼠標松開右鍵 29 MiddleDown = 0x0020, //鼠標按下中鍵 30 MiddleUp = 0x0040, //鼠標松開中鍵 31 XDown = 0x0080, 32 XUp = 0x0100, 33 Wheel = 0x0800, //鼠標輪被移動 34 VirtualDesk = 0x4000, //虛擬桌面 35 Absolute = 0x8000 36 } 37 //設置鼠標位置 38 [DllImport("user32.dll")] 39 static extern bool SetCursorPos(int X, int Y); 40 41 //設置鼠標按鍵和動作 42 [DllImport("user32.dll")] 43 static extern void mouse_event(MouseEventFlag flags, int dx, int dy,uint data, UIntPtr extraInfo); //UIntPtr指針多句柄類型 44 45 [DllImport("user32.dll")] 46 static extern IntPtr FindWindow(string strClass, string strWindow); 47 48 //該函數獲取一個窗口句柄,該窗口雷鳴和窗口名與給定字符串匹配 hwnParent=Null從桌面窗口查找 49 [DllImport("user32.dll")] 50 static extern IntPtr FindWindowEx(IntPtr hwndParent, IntPtr hwndChildAfter, string strClass, string strWindow); 51 52 [DllImport("user32.dll")] 53 static extern bool GetWindowRect(HandleRef hwnd, out NativeRECT rect); 54 55 56 public static void MouseClick() 57 { 58 mouse_event(MouseEventFlag.LeftDown, 0, 0, 0, UIntPtr.Zero); 59 mouse_event(MouseEventFlag.LeftUp, 0, 0, 0, UIntPtr.Zero); 60 } 61 } 62 }
using System; using System.Collections.Generic; using System.Runtime.InteropServices; using System.Text; namespace AutoKeyTool { public class Win32Api { #region 常數和結構 public const int WM_KEYDOWN = 0x100; public const int WM_KEYUP = 0x101; public const int WM_SYSKEYDOWN = 0x104; public const int WM_SYSKEYUP = 0x105; public const int WH_KEYBOARD_LL = 13; [StructLayout(LayoutKind.Sequential)] //聲明鍵盤鈎子的封送結構類型 public class KeyboardHookStruct { public int vkCode; //表示一個在1到254間的虛似鍵盤碼 public int scanCode; //表示硬件掃描碼 public int flags; public int time; public int dwExtraInfo; } #endregion #region Api public delegate int HookProc(int nCode, Int32 wParam, IntPtr lParam); //安裝鈎子的函數 [DllImport("user32.dll", CharSet = CharSet.Auto, CallingConvention = CallingConvention.StdCall)] public static extern int SetWindowsHookEx(int idHook, HookProc lpfn, IntPtr hInstance, int threadId); //卸下鈎子的函數 [DllImport("user32.dll", CharSet = CharSet.Auto, CallingConvention = CallingConvention.StdCall)] public static extern bool UnhookWindowsHookEx(int idHook); //下一個鈎掛的函數 [DllImport("user32.dll", CharSet = CharSet.Auto, CallingConvention = CallingConvention.StdCall)] public static extern int CallNextHookEx(int idHook, int nCode, Int32 wParam, IntPtr lParam); [DllImport("user32")] public static extern int ToAscii(int uVirtKey, int uScanCode, byte[] lpbKeyState, byte[] lpwTransKey, int fuState); [DllImport("user32")] public static extern int GetKeyboardState(byte[] pbKeyState); [DllImport("kernel32.dll", CharSet = CharSet.Auto, CallingConvention = CallingConvention.StdCall)] public static extern IntPtr GetModuleHandle(string lpModuleName); #endregion } }
調用放在winform窗體里面了,如果需要可下載源碼:鏈接: http://pan.baidu.com/s/1jGO85Xc 密碼: jk37