码迷,mamicode.com
首页 > Windows程序 > 详细

C#实现自动单击

时间:2015-12-30 22:07:33      阅读:402      评论:0      收藏:0      [点我收藏+]

标签:

最新玩了一下上学时候玩的游戏,但游戏里面变化太多了,进去后等级就很高,要不停地点击鼠标加技能。

所以利用工作中常用的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

C#实现自动单击

标签:

原文地址:http://www.cnblogs.com/lclblog/p/5090055.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!