Как захватить текст с помощью указателя мыши и сочетаний клавиш?
Я хочу захватывать текст из открытых окон, используя указатель мыши и сочетание клавиш с помощью 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: ( ссылка)
- Робот: createScreenCapture(Rectangle screenRect)
- Робот: getPixelColor(int x, int y)
- Робот: keyPress(int keycode)
- Робот: keyRelease(int keycode)
- Робот: mouseMove(int x, int y)
- Робот: mousePress(кнопки int)
- Робот: mouseRelease(кнопки int)
- Робот: mouseWheel(int wheelAmt)
Использование C#.
Есть множество решений. Просто гуглите " Тестировать автоматизацию C# " или " spy C# ".
MSDN: SendKeys
MSDN: Как: имитировать события мыши и клавиатуры в коде
Вы можете использовать Windows API, но это требует утомительной работы. Вы не хотите этого делать, вы действительно не хотите, но если вы это сделаете, то обязательно проверьте:
- http://www.pinvoke.net/default.aspx/user32.mouse_event
- http://www.pinvoke.net/default.aspx/user32.sendinput
Я рекомендую вам использовать 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.
}
}
}