zoukankan      html  css  js  c++  java
  • C#实现自动单击

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

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

  • 相关阅读:
    Java零基础系列教程015Java异常
    Java零基础系列教程013Java多态
    Java零基础系列教程12Java继承
    Java零基础系列教程11Java类和对象练习之扑克模拟
    Java零基础系列教程10Java抽象与封装
    【原创】Linux虚拟化KVM-Qemu分析(四)之CPU虚拟化(2)
    【原创】Linux虚拟化KVM-Qemu分析(三)之KVM源码(1)
    【原创】Linux虚拟化KVM-Qemu分析(二)之ARMv8虚拟化
    如何取书名(2)
    《金融业人工智能实践 》(Hands-On Artificial Intelligence for Banking) 阅读指南
  • 原文地址:https://www.cnblogs.com/lclblog/p/5090055.html
Copyright © 2011-2022 走看看