Как захватить текст с помощью указателя мыши и сочетаний клавиш?

Я хочу захватывать текст из открытых окон, используя указатель мыши и сочетание клавиш с помощью C# или Java (например, Babylon), так что мне нужно знать и как это реализовать?

Какие библиотеки мне нужно использовать? или я могу использовать winapi?

1 ответ

Решение

Используйте язык сценариев, чтобы создать черновик того, что вы хотите сделать.

Вы можете использовать такие программы, как AutoHotKey или AutoIt. Обратите внимание, что у вас есть авто рекордер, который дает вам базовый проект. Вы можете скомпилировать эти сценарии в исполняемые файлы и вызывать их из C# или Java с помощью Shell Execute ( C#; java (exec)) или запускать как новый процесс ( C#; java (построитель процессов)). Последнее предпочтительнее.

Вот пример того, как сопоставить клавишу "пауза" с функцией, которая выбирает текст на экране, копирует его и вставляет его в другое место, используя AutoHotKey. Shift + left click используется на фоне, чтобы выделить весь текст. Обратите внимание, что это простейший пример, он не вызывает окно по его указателю и использует фиксированные местоположения (и работает только для одного разрешения).

HotKeySet("{PAUSE}", "getInput")

While 1
    Sleep(100)
Wend


Func getInput()
    MouseClick("left",272,241,1)
    Sleep(100)
    MouseClick("left",272,241,1)
    Send("{SHIFTDOWN}")
    MouseClick("left",272,241,1)
    MouseClick("left",529,242,2)
    Send("{SHIFTUP}{CTRLDOWN}c{CTRLUP}")
    MouseClick("left",656,42,1)
    Sleep(100)  
    MouseClick("left",696,42,1)
    Send("{CTRLDOWN}a")
    Send("{DELETE}")
    Send("{CTRLDOWN}v{CTRLUP}")
    MouseClick("left",1178,44,1)
EndFunc

Используя Java.

Java содержит Robot класс, чтобы сделать это.

Этот класс используется для генерации собственных событий системного ввода для целей автоматизации тестирования, самостоятельных демонстраций и других приложений, где необходимо управление мышью и клавиатурой. Основная цель Robot - облегчить автоматизированное тестирование реализаций платформы Java.

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

Обратите внимание, что некоторые платформы требуют специальных привилегий или расширений для доступа к низкоуровневому управлению вводом. Если текущая конфигурация платформы не допускает управление вводом, при попытке построить объекты робота будет сгенерировано исключение AWTException. Например, системы X-Window будут генерировать исключение, если стандартное расширение XTEST 2.2 не поддерживается (или не включено) X-сервером.

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

Вы можете адаптировать, как вы используете робота самостоятельно, но в целом:

import java.awt.Robot;
import java.awt.event.InputEvent;
import java.awt.event.KeyEvent;

public class Tester {
    public static void doLeftMouseClick(Robot r, int x, int y) {
        r.mouseMove(x, y);
        r.mousePress(InputEvent.BUTTON1_MASK);
        r.mouseRelease(InputEvent.BUTTON1_MASK);
    }

    public static void doLeftMouseClickEvent(Robot r, int x, int y, int nr) {
        r.mouseMove(x, y);
        if (nr == 1)
            r.mousePress(InputEvent.BUTTON1_MASK);
        else
            r.mouseRelease(InputEvent.BUTTON1_MASK);
    }

    public static void main(String args[]) throws Exception {
        Robot r = new Robot();
        doLeftMouseClick(r, 272, 241);
        r.delay(1000);
        doLeftMouseClick(r, 272, 241);
        r.keyPress(KeyEvent.SHIFT_MASK);
        doLeftMouseClickEvent(r, 272, 241, 1);
        doLeftMouseClickEvent(r, 529, 242, 2);
        r.keyRelease(KeyEvent.SHIFT_MASK);
        r.keyPress(KeyEvent.CTRL_MASK);
        r.keyPress(KeyEvent.VK_C);
        r.keyRelease(KeyEvent.CTRL_MASK);
        // etc.
    }
}

Больше примеров роботов на java2s: ( ссылка)

  1. Робот: createScreenCapture(Rectangle screenRect)
  2. Робот: getPixelColor(int x, int y)
  3. Робот: keyPress(int keycode)
  4. Робот: keyRelease(int keycode)
  5. Робот: mouseMove(int x, int y)
  6. Робот: mousePress(кнопки int)
  7. Робот: mouseRelease(кнопки int)
  8. Робот: mouseWheel(int wheelAmt)

Использование C#.

Есть множество решений. Просто гуглите " Тестировать автоматизацию C# " или " spy C# ".

MSDN: SendKeys
MSDN: Как: имитировать события мыши и клавиатуры в коде

Вы можете использовать Windows API, но это требует утомительной работы. Вы не хотите этого делать, вы действительно не хотите, но если вы это сделаете, то обязательно проверьте:

Я рекомендую вам использовать InputSimulator. Пример:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
// add reference to following
using WindowsInput;
using System.Windows.Forms;
using System.Drawing;

namespace ConsoleApplicationTester
{
    class Program
    {
        public static void doLeftMouseClick(int x, int y)
        {
            Cursor.Position = new System.Drawing.Point(x, y);
            InputSimulator.SimulateKeyPress(VirtualKeyCode.LBUTTON);
        }
        public static void doLeftMouseClickEvent(int x, int y, int nr)
        {
            Cursor.Position = new Point(x, y);
            if(nr==1)
                InputSimulator.SimulateKeyDown(VirtualKeyCode.LBUTTON);
            else
                InputSimulator.SimulateKeyUp(VirtualKeyCode.LBUTTON);
        }

        static void Main(string[] args){
            doLeftMouseClick( 272, 241);
            System.Threading.Thread.Sleep(100);
            doLeftMouseClick( 272, 241);
            InputSimulator.SimulateKeyDown(VirtualKeyCode.MENU);
            doLeftMouseClickEvent(272, 241, 1);
            doLeftMouseClickEvent(529, 242, 2);
            InputSimulator.SimulateKeyUp(VirtualKeyCode.MENU);
            InputSimulator.SimulateKeyDown(VirtualKeyCode.CONTROL);
            InputSimulator.SimulateKeyUp(VirtualKeyCode.VK_C);
            InputSimulator.SimulateKeyUp(VirtualKeyCode.CONTROL);
            // etc.          
        }
    }
}
Другие вопросы по тегам