8

我想使用 C# 或 java(如babylon)使用鼠标指针和键盘快捷键从打开的窗口中捕获文本,那么我需要知道什么以及如何实现它?

我需要使用哪些库?或者我可以使用winapi吗?

4

1 回答 1

13

使用脚本语言创建您想要做的事情的草稿。

您可以使用AutoHotKeyAutoIt等程序。请注意,您包括自动录音机,它为您提供基本草稿。您可以将这些脚本编译为可执行文件,并使用 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。

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 上的更多机器人示例:(链接)

  1. 机器人:createScreenCapture(矩形 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. 机器人:mouseWheel(int wheelAmt)

使用 C#。

无数的解决方案。只需谷歌Test Automation 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.          
        }
    }
}
于 2010-10-30T19:11:37.550 回答