隐藏

C#模拟实现鼠标自动点击与消息发送功能

发布:2023/10/19 23:30:32作者:管理员 来源:本站 浏览次数:431

一个简单的实现版本,没有去Hook键鼠等操作,事先录制好操作步骤(将鼠标移动到需要操作的位置,按下热键执行相应动作),点击运行即可。


主要还是用windows api来实现,模拟点击、右击、双击、发送文本等。


代码可能略长一点,下面发下关键代码


主要的思路就是操作热键的时候,将操作类型以及坐标记录到一个List中,然后利用Windows Api循环执行List中的数据


实现功能


模拟鼠标点击、文本输入


开发环境


开发工具: Visual Studio 2013


.NET Framework版本:4.5


实现代码



#region 鼠标操作类型

private const int MOUSEEVENTF_MOVE = 1;//鼠标移动


private const int MOUSEEVENTF_LEFTDOWN = 2;//按下鼠标左键


private const int MOUSEEVENTF_LEFTUP = 4;//抬起鼠标左键


private const int MOUSEEVENTF_RIGHTDOWN = 8;//按下鼠标右键


private const int MOUSEEVENTF_RIGHTUP = 16;//抬起鼠标右键


#endregion


#region Windows Api

/// <summary>

/// 鼠标操作

/// </summary>

/// <param name="dwFlags"></param>

/// <param name="dx"></param>

/// <param name="dy"></param>

/// <param name="cButtons"></param>

/// <param name="dwExtraInfo"></param>

[DllImport("user32.dll", CallingConvention = CallingConvention.StdCall, CharSet = CharSet.Auto)]

public static extern void mouse_event(int dwFlags, int dx, int dy, int cButtons, int dwExtraInfo);


/// <summary>

/// 设置鼠标位置

/// </summary>

/// <param name="x"></param>

/// <param name="y"></param>

/// <returns></returns>

[DllImport("user32")]

public static extern int SetCursorPos(int x, int y);


/// <summary>

/// 注册热键

/// </summary>

/// <param name="hWnd"></param>

/// <param name="id"></param>

/// <param name="control"></param>

/// <param name="vk"></param>

/// <returns></returns>

[DllImport("user32")]

public static extern bool RegisterHotKey(IntPtr hWnd, int id, uint control, Keys vk);


/// <summary>

/// 取消热键

/// </summary>

/// <param name="hWnd"></param>

/// <param name="id"></param>

/// <returns></returns>

[DllImport("user32")]

public static extern bool UnregisterHotKey(IntPtr hWnd, int id);


#endregion




private List<EventClass> listEvent = new List<EventClass>();

/// <summary>

 /// 注册/取消热键

 /// </summary>

 /// <param name="isReg"></param>

 private void RegistKey(bool isReg)

 {

     if (isReg)

     {

         RegisterHotKey(base.Handle, 30001, MOD_CONTROL, Keys.D1);

         RegisterHotKey(base.Handle, 30002, MOD_CONTROL, Keys.D2);

         RegisterHotKey(base.Handle, 30003, MOD_CONTROL, Keys.D3);

         RegisterHotKey(base.Handle, 30004, MOD_CONTROL, Keys.D4);

         RegisterHotKey(base.Handle, 30005, MOD_CONTROL, Keys.E);

     }

     else

     {

         UnregisterHotKey(base.Handle, 30001);

         UnregisterHotKey(base.Handle, 30002);

         UnregisterHotKey(base.Handle, 30003);

         UnregisterHotKey(base.Handle, 30004);

         UnregisterHotKey(base.Handle, 30005);

     }

 }

 

 //执行点击事件

 private void MouseClick(EventClass eventData)

 {

     SetCursorPos(eventData.X, eventData.Y);

     switch (eventData.clickType)

     {

         case ClickType.leftClick:

             mouse_event(MOUSEEVENTF_LEFTDOWN, 0, 0, 0, 0);

             mouse_event(MOUSEEVENTF_LEFTUP, 0, 0, 0, 0);

             break;

         case ClickType.rightClick:

             mouse_event(MOUSEEVENTF_RIGHTDOWN, 0, 0, 0, 0);

             mouse_event(MOUSEEVENTF_RIGHTUP, 0, 0, 0, 0);

             break;

         case ClickType.doubleClick:

             mouse_event(MOUSEEVENTF_LEFTDOWN, 0, 0, 0, 0);

             mouse_event(MOUSEEVENTF_LEFTUP, 0, 0, 0, 0);

             Thread.Sleep(100);

             mouse_event(MOUSEEVENTF_LEFTDOWN, 0, 0, 0, 0);

             mouse_event(MOUSEEVENTF_LEFTUP, 0, 0, 0, 0);

             break;

     }

 }

 

 //执行设置文本事件

 private void SetText(EventClass eventData)

 {

     SendKeys.SendWait(eventData.Text);

 }

 

/// <summary>

 /// 录制

 /// </summary>

 /// <param name="sender"></param>

 /// <param name="e"></param>

 private void btnRecord_Click(object sender, EventArgs e)

 {

     CancelTask = new CancellationTokenSource();

     RegistKey(true);

     EnableControl(false);

     AddLog("正在录制...");

     KeyPress += new KeyPressEventHandler(Click_KeyPress);

 }

 

 /// <summary>

 /// 执行

 /// </summary>

 /// <param name="sender"></param>

 /// <param name="e"></param>

 private void btnRun_Click(object sender, EventArgs e)

 {

     int interval = string.IsNullOrEmpty(txtInterval.Text) ? 0 : Convert.ToInt32(txtInterval.Text);

 

     int count = string.IsNullOrEmpty(txtCount.Text) ? 1 : Convert.ToInt32(txtCount.Text);

 

     Task.Factory.StartNew(() =>

     {

         for (int i = 0; i < count; i++)

         {

             foreach (EventClass current in listEvent)

             {

                 if (current.clickType == ClickType.SendKeys)

                 {

                     SetText(current);

                 }

                 else

                 {

                     MouseClick(current);

                 }

                 

                 Thread.Sleep(interval * 1000);

             }

             

             AddLog("第" + (i + 1) + "次执行结束");

 

             try

             {

                 CancelTask.Token.ThrowIfCancellationRequested();

             }

             catch (System.OperationCanceledException ex)

             {

                 AddLog("已手动结束执行");

                 return;

             }

         }

         AddLog("自动执行结束...");

         KeyPress += new KeyPressEventHandler(Click_KeyPress);

     }, CancelTask.Token);

 }

 

 private void Click_KeyPress(object sender, KeyPressEventArgs e)

  {

      string logStr = string.Empty;

      ClickType clickType = ClickType.leftClick;

      string key = e.KeyChar.ToString().ToUpper();

      switch (key)

      {

          case "1":

              clickType = ClickType.leftClick;

              logStr = "点击了鼠标左键";

              break;

          case "2":

              clickType = ClickType.rightClick;

              logStr = "点击了鼠标右键";

              break;

          case "3":

              clickType = ClickType.doubleClick;

              logStr = "双击了鼠标左键";

              break;

          case "4":

              clickType = ClickType.SendKeys;

              logStr = "发送了文本:" + txtValue.Text;

              break;

          default:

              logStr = "按下了" + e.KeyChar + "键,无效!";

              break;

      }

 

      int x = Cursor.Position.X;

      int y = Cursor.Position.Y;

      AddLog("在 (" + x + "," + y + ") 位置," + logStr);

 

      EventClass eventClass = new EventClass();

      eventClass.clickType = clickType;

      eventClass.X = x;

      eventClass.Y = y;

      if (!string.IsNullOrEmpty(txtValue.Text))

      {

          eventClass.Text = txtValue.Text;

      }

      listEvent.Add(eventClass);

  }