Еще один способ сделать щелчок мыши? - PullRequest
0 голосов
/ 02 ноября 2019

Я делаю ИИ и хочу, чтобы он функционировал как игрок. Я использую некоторый код, чтобы сделать щелчок мыши, и это работает. Затем я сделал код для щелчка мышью в случайных местах, но затем он перестал работать.

Я изменил

private const int MOUSEEVENTF_LEFTDOWN = 0x02;
private const int MOUSEEVENTF_LEFTUP = 0x04; 

на

private const int MOUSEEVENTF_LEFTDOWN = 0x0002;
private const int MOUSEEVENTF_LEFTUP = 0x0004;

, но это не таккажется, что-то изменить, кроме места, где он нажал. Я также заставил его подождать 0,5 секунды между mouseDown и mouseUp, но он все еще не работал, когда я запустил rndPlay();, когда я попытался сделать просто press1();, это сработало.

        public static void MoveTo(int x, int y)
        {
            mouse_event(MOUSEEVENTF_ABSOLUTE | MOUSEEVENTF_MOVE, x, y, 0, 0);
        }

        public static void LeftClick()
        {
            mouse_event(MOUSEEVENTF_LEFTDOWN, System.Windows.Forms.Control.MousePosition.X, System.Windows.Forms.Control.MousePosition.Y, 0, 0);
            mouse_event(MOUSEEVENTF_LEFTUP, System.Windows.Forms.Control.MousePosition.X, System.Windows.Forms.Control.MousePosition.Y, 0, 0);
        }
        public static void LeftMouseClick(int x, int y)
        {
            MoveTo(x, y);
            LeftClick();

        }

        public static void press1()
        {
            LeftMouseClick(28000, 25000);
            last2Moves("1");
        }
        public static void press2()
        {
            LeftMouseClick(33000, 25000);
            last2Moves("2");
        }
        //etc

        public static void rndPlay()
        {
            for (int r = 0; moveSucces != true && r < 10000; r++)
            {

                Random rndP = new Random();
                int rndPress = rndP.Next(1, 10);
                if (rndPress == 1)
                {
                    press1();
                }
                if (rndPress == 2)
                {
                    press2();
                }
                    //etc
             }
         }

Когда язапустить rndPlay(); Я вижу движение мыши, но, кажется, не щелкает. Есть ли другой способ сделать щелчок мыши в месте, которое будет работать лучше / быстрее?

1 Ответ

0 голосов
/ 02 ноября 2019

Помимо использования очень больших значений для X и Y ваш код выглядит нормально. Я набрал небольшой пример, используя textbox, чтобы показать, когда и где была нажата мышь, и подключен к простому таймеру Forms для имитации щелчков.

public partial class Form1 : Form
{
   [DllImport("user32.dll", CharSet = CharSet.Auto, CallingConvention = CallingConvention.StdCall)]
   public static extern void mouse_event(uint dwFlags, uint dx, uint dy, uint cButtons, uint dwExtraInfo);

   private const int MouseLeftDown = 0x02;
   private const int MouseLeftUp = 0x04;

   private readonly Timer _timer = new Timer();

   public Form1()
   {
      InitializeComponent();

      _timer.Interval = 1000;
      _timer.Tick += (s, a) => mouse_event(MouseLeftDown | MouseLeftUp, (uint)MousePosition.X, (uint)MousePosition.Y, 0, 0);
      _timer.Enabled = true;

      _textBox.Click += (s, a) => _textBox.AppendText($"Clicked at {PointToClient(MousePosition)}\n");
   }
}
...