我想使用鼠标指针和键盘快捷键使用C#或java(如babylon)从打开的窗口捕获文本,那么我需要知道什么以及如何实现它?
我需要使用哪些库?或者我可以使用winapi吗?
您可以使用AutoHotKey或AutoIt等程序.请注意,包含自动记录器,可以为您提供基本的草稿.您可以将这些脚本编译为可执行文件,并使用Shell Execute(c# ; java(exec))从C#或Java调用它们,或者作为新进程运行(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包含Robot
类,要做到这一点.
此类用于生成本机系统输入事件,以用于测试自动化,自运行演示以及需要控制鼠标和键盘的其他应用程序.Robot的主要目的是促进Java平台实现的自动化测试.
使用类生成输入事件不同于将事件发布到AWT事件队列或AWT组件,因为事件是在平台的本机输入队列中生成的.例如,Robot.mouseMove实际上将移动鼠标光标而不是仅生成鼠标移动事件.
请注意,某些平台需要特殊权限或扩展才能访问低级输入控件.如果当前平台配置不允许输入控制,则在尝试构造Robot对象时将抛出AWTException.例如,如果X服务器不支持(或未启用)XTEST 2.2标准扩展,则X-Window系统将抛出异常.
将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:createScreenCapture(Rectangle screenRect)
Robot:getPixelColor(int x,int y)
机器人:keyPress(int keycode)
Robot:keyRelease(int keycode)
机器人:mouseMove(int x,int y)
机器人:mousePress(int按钮)
机器人:mouseRelease(int按钮)
机器人:mouseWheel(int wheelAmt)
有无数的解决方案.只需谷歌 " 测试自动化c# "或" 间谍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. } } }