【发布时间】:2011-04-30 05:33:57
【问题描述】:
我想使用 C# 或 java 使用鼠标指针和键盘快捷键从打开的窗口中捕获文本 (比如babylon),所以 我需要知道什么以及如何实现它?
我需要使用哪些库?或者我可以使用winapi吗?
【问题讨论】:
标签: c# java text-capture
我想使用 C# 或 java 使用鼠标指针和键盘快捷键从打开的窗口中捕获文本 (比如babylon),所以 我需要知道什么以及如何实现它?
我需要使用哪些库?或者我可以使用winapi吗?
【问题讨论】:
标签: c# java text-capture
您可以使用 AutoHotKey 或 AutoIt 等程序。请注意,您包括自动录音机,它为您提供基本草稿。您可以将这些脚本编译为可执行文件,并使用 Shell Execute (c#;java (exec)) 从 C# 或 Java 调用它们或作为新进程运行 (c#;java (process builder))。后者是首选。
这是一个示例,说明如何将键“暂停”映射到从屏幕中选择文本、复制文本并使用 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 类,可以做到这一点。
该类用于生成native 系统输入事件的目的 测试自动化,自运行 演示和其他应用程序 鼠标和键盘的控制是 需要。机器人的主要用途 是为了便于自动化测试 Java 平台实现。
使用类生成输入 事件不同于将事件发布到 AWT 事件队列或 AWT 组件 因为事件是在 平台的本机输入队列。为了 例如,Robot.mouseMove 实际上会 移动鼠标光标而不是仅仅移动 生成鼠标移动事件。
请注意,某些平台需要 特权或扩展 访问低级输入控制。如果 当前平台配置确实 不允许输入控制,一个 AWTException 将被抛出 试图构建机器人对象。为了 例如,X-Window 系统会抛出 XTEST 2.2 的例外情况 不支持标准扩展 (或未启用)由 X 服务器。
使用机器人的应用程序 自检以外的目的 应该处理这些错误情况 优雅地。
您可以自己定制如何使用机器人,但一般方式:
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 上的更多机器人示例:(link)
有无数种解决方案。只需 google“Test Automation c#”或“spy c#”。
MSDN:SendKeys
MSDN:How to: Simulate Mouse and Keyboard Events in Code
您可以使用 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.
}
}
}
【讨论】:
Shift+double click(select)、Control+C(copy) 和 @987654341 @(paste) 或使用剪贴板更改来调用事件。