Nano Hash - криптовалюты, майнинг, программирование

Перемещение мыши по заданным координатам

я хочу, чтобы после записи движения мыши и сохранения координат/индексов/положения мне пришлось загрузить координаты мыши и заставить мышь двигаться в соответствии с загруженными координатами, у меня нет кода, чтобы показать вам, потому что я застрял на эта точка

     ' private void button3_Click_1(object sender, EventArgs e)
        {
            StreamWriter writer;
            SaveFileDialog saveFileDialog1 = new SaveFileDialog();
            string[] cvsArray = new string[10000];
            saveFileDialog1.Filter = "All files (*.All)|*.All|All files (*.*)|*.*";

            if (saveFileDialog1.ShowDialog() == DialogResult.OK)
            {
                writer = File.CreateText(saveFileDialog1.FileName);
                // if ((myStream = saveFileDialog1.OpenFile()) != null)
                //{
                for (int i = 0; i < cvsArray.Length; i++)
                {
                    string text = richTextBox1.Text;
                    writer.WriteLine(text);
                }
                // Code to write the stream goes here.
                writer.Close();
                //}
            }
        }
 private void button11_Click(object sender, EventArgs e)
        {
            StreamReader reader;
            string Line;
            string[] cvsArray;
            string position;

            //set the filter to dialog control
            openFileDialog1.Filter = FILTER;
            //check if the user selected the right file
            if (openFileDialog1.ShowDialog() == DialogResult.OK)
            {
                //open the selected file
                reader = File.OpenText(openFileDialog1.FileName);
                //Read the entireline form the file
                Line = reader.ReadLine();
                //read while it is still not the end of the file 
                while (!reader.EndOfStream)
                {
                    Line = reader.ReadLine();
                    //Splite the line using array
                    cvsArray = Line.Split(':');

                    position = cvsArray[0];
                    //position = cvsArray[1];
                    listBox1.Items.Add(position);
                }
            }
        }'
25.04.2018


Ответы:


1

Это быстрое и довольно грязное решение:

Начнем с нескольких переменных:

 List<Point> points = null;
 Timer tt = null;
 int index = 0;

Теперь кнопка для запуска перекодирования; он инициализирует List<Point> для сбора позиций и создает и запускает Timer вместе с кодом lambda для перекодирования в событии Timer.Tick:

private void btn_Record_Click(object sender, EventArgs e)
{
    points = new List<Point>();
    index = 0;
    tt = new Timer()
    { Interval = 50, Enabled = true };
    tt.Tick += (ss, ee) => 
    {
        if (!points.Any() || points.Last() != Control.MousePosition) 
           points.Add(Control.MousePosition); 
    };
}

Рядом кнопка остановки записи:

private void btn_Stop_Click(object sender, EventArgs e)
{
    if (tt!=null) tt.Stop();
}

Наконец, кнопка повтора; он использует индекс для перебора коллекции точек в новом коде Timer.Tick, но с тем же таймером:

private void btn_Replay_Click(object sender, EventArgs e)
{
    index = 0;
    tt = new Timer() { Interval = 50, Enabled = true };
    tt.Tick += (ss, ee) =>
    {
        if (index < points.Count)
          { System.Windows.Forms.Cursor.Position =  points[index++]; }
        else tt.Stop();
}

Несколько заметок:

  • Как задано в вопросе, это будет записывать и отвечать на координаты Mmouse. Это будет происходить с фиксированными интервалами, поэтому воспроизведение будет очень похоже на оригинальные движения; на самом деле это так сложно отличить, что я добавил кнопку слоумо с более длинным интервалом для демонстрации.. (Но гифка стала слишком большой)

  • Код будет записывать положения мыши в экранных координатах и ​​должен фиксировать их везде, а не только внутри вашего приложения. Посмотрите, как VS активирует лупу кода!

  • Он не будет записывать никаких других событий мыши, таких как вверх, вниз, щелчок, двойной щелчок или колесо. Для них вам понадобится глобальный хук мыши для захвата и несколько внешних вызовов для воспроизведения.

  • Для включения других событий мыши вам также потребуется другая и расширенная структура данных; и вам также придется перейти от модели, управляемой таймером, к модели, управляемой мышью.

  • В примере используются кнопки для запуска и остановки. Конечно, движения к этим кнопкам и от них включаются в записанный список позиций. Вместо этого можно использовать запуск по времени, при котором запись начнется через несколько секунд и остановится через несколько секунд бездействия.

Существуют различные способы сохранения и загрузки точек; самый простой — сериализовать в xml; используя string path = @"...", это может выглядеть так просто:

private void btn_save_Click(object sender, EventArgs e)
{
    if (points == null) points = new List<Point>();
    XmlSerializer xs = new XmlSerializer((points).GetType());
    using (TextReader tr = new StreamReader(path))
    {
        points =  (List<Point>)xs.Deserialize(tr);
        tr.Close();
    }
}

private void btn_load_Click(object sender, EventArgs e)
{
    XmlSerializer xs = new XmlSerializer((points).GetType());
    using (TextWriter tw = new StreamWriter(path))
    {
        xs.Serialize(tw, points);
        tw.Close();
    }
}

Другими способами могут быть использование двоичного форматирования или пользовательской процедуры преобразования. XML относительно стабилен.

Вот короткий клип:

введите здесь описание изображения

25.04.2018
  • Моя программа записывает и сохраняет индексы, чего я и хочу до сих пор, но я работаю над тем, чтобы заставить мышь читать загруженные индексы и двигаться в соответствии с ними. например, после того, как я загружу индексы, я нажму кнопку воспроизведения, и мышь будет двигаться 25.04.2018
  • Это именно то, что делает кнопка Replay. Трудно различить реальное и воспроизведенное движение, что только показывает, что оно работает довольно хорошо. 25.04.2018
  • Спасибо, это работает отлично. Но что, если у меня есть список индексов и я хочу, чтобы мышь двигалась по этим индексам? или лучше сохранить записанный ход как видео? @TaW 26.04.2018
  • Что это за «индексы»? Откуда они? И: Какова цель? 26.04.2018
  • У меня есть список, который показывает мне индексы мыши, когда я ее перемещаю. Затем у меня есть кнопка сохранения, которая позволяет мне сохранить то, что есть в списке, и это работает. Я могу сохранить индексы/положение мыши в файле. Теперь у меня есть еще одна кнопка, которая позволяет загружать/открывать файл с индексами/положением мыши, который работает. (У меня есть кнопка воспроизведения, которая воспроизводит запись). Теперь, после загрузки, я хочу нажать кнопку воспроизведения, и это проверит, является ли список! Null, затем прочитает список и заставит мышь перемещаться в соответствии с этими позициями в файле . (Разве это имеет смысл!) @Taw 26.04.2018
  • Цель сохранить запись мыши, сейчас я могу только записывать и воспроизводить, но я также хочу записать 26.04.2018
  • Хм? Пожалуйста, объясните: вы можете записывать и воспроизводить, но не записывать?? Звучит странно. Вы имеете в виду запись и хранение данных? Также: какие «идексы» вы записываете? Покажите структуру данных! 26.04.2018
  • Извините за плохое объяснение, поэтому у меня есть кнопка для записи и воспроизведения, как у вас. У меня есть listBox1, который показывает мне положение мыши и еще один пустой listBox2. У меня есть кнопка, которая сохраняет позиции мыши из listBox1 в файле. Другая кнопка открывает файл с позициями мыши и загружает позиции в listBox2. Данные, которые отображаются в listBox2, представляют собой строку и ничего не делают. Итак, как я могу заставить мышь двигаться, когда я открываю файл и загружаю данные? Или есть другой способ сохранить запись? 26.04.2018
  • Ну, есть много способов содрать шкуру с кошки. Вы можете сохранить как список строк или сериализовать в xml. При десериализации вы получаете исходный List‹Point› обратно. При чтении текстового файла вам придется преобразовывать его построчно. Если вы хотите переместить мышь в позицию в списке, вы можете закодировать событие SelectionChanged. Затем сверните строку в точку и переместите курсор. Если хотите, я могу добавить код для кнопки сохранения и загрузки. 26.04.2018
  • Я написал код как для сохранения, так и для загрузки, но в виде строки, но как мне конвертировать, читая построчно? 28.04.2018
  • Возможно, изучив функции Split и Convert! Но не видя ни кода, ни данных, я могу только догадываться. - Как я уже писал, сериализация данных довольно проста. Как писать и читать числа 28.04.2018
  • Если я опубликую код, который я сделал, не могли бы вы дать мне представление о том, как мне это сделать? @TaW 30.04.2018
  • Конечно, отредактируйте вопрос и включите несколько строк текста, который вы пишете. Также решите, хотите ли вы/нужен текст или можете использовать xml или даже двоичный файл. 30.04.2018
  • Я редактировал, и если вы рекомендуете XML, я хотел бы пойти на это. 02.05.2018
  • Я обновил ответ несколькими примечаниями и примером сохранения/загрузки. 02.05.2018
  • это было действительно полезно, большое спасибо за помощь, и извините, что слишком долго переигрывал 08.05.2018
  • Новые материалы

    Кластеризация: более глубокий взгляд
    Кластеризация — это метод обучения без учителя, в котором мы пытаемся найти группы в наборе данных на основе некоторых известных или неизвестных свойств, которые могут существовать. Независимо от..

    Как написать эффективное резюме
    Предложения по дизайну и макету, чтобы представить себя профессионально Вам не позвонили на собеседование после того, как вы несколько раз подали заявку на работу своей мечты? У вас может..

    Частный метод Python: улучшение инкапсуляции и безопасности
    Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

    Как я автоматизирую тестирование с помощью Jest
    Шутка для победы, когда дело касается автоматизации тестирования Одной очень важной частью разработки программного обеспечения является автоматизация тестирования, поскольку она создает..

    Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
    Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

    Понимание расстояния Вассерштейна: мощная метрика в машинном обучении
    В обширной области машинного обучения часто возникает необходимость сравнивать и измерять различия между распределениями вероятностей. Традиционные метрики расстояния, такие как евклидово..

    Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
    В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..