Как захватить текст с помощью указателя мыши и сочетаний клавиш? - PullRequest
8 голосов
/ 25 октября 2010

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

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

1 Ответ

13 голосов
/ 30 октября 2010

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

Вы можете использовать такие программы, как 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. Робот: колесо мыши (int wheelAmt)

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

Существует множество решений.Просто google" Автоматизация тестирования 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.          
        }
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...