我想使用C#或java使用鼠标指针和键盘快捷键从打开的窗口捕获文本 (如babylon),所以 我需要知道什么以及如何实施它?
我需要使用哪些库?或者我可以使用winapi吗?
答案 0 :(得分:13)
您可以使用 AutoHotKey 或 AutoIt 等程序。请注意,包含自动记录器,可以为您提供基本的草稿。您可以将这些脚本编译为可执行文件,并使用Shell Execute(c#; java(exec))从C#或Java调用它们,或者作为新进程运行(c#; {{3} (进程构建器))。后者是首选。
以下是如何将键“暂停”映射到从屏幕中选择文本的功能,复制它并使用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类,为此。
此类用于生成本机 用于此目的的系统输入事件 测试自动化,自运行 演示和其他应用程序 控制鼠标和键盘是 需要。机器人的主要目的 是为了方便自动化测试 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上的更多机器人示例:(Robot
)
有无数的解决方案。只需谷歌“link”或“Test Automation c#”。
您可以使用Windows API,但这需要一些繁琐的工作。你不想这样做,你真的不这样做,但如果你这样做,那么一定要看看:
我建议您使用http://www.pinvoke.net/default.aspx/user32.sendinput。例如:
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.
}
}
}