如何使用鼠标指针和键盘快捷键捕获文本?

Rad*_*adi 8 c# java text-capture

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

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

Mar*_*gus 13

使用脚本语言创建您要执行的操作的草稿.

您可以使用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
Run Code Online (Sandbox Code Playgroud)

使用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.
    }
}
Run Code Online (Sandbox Code Playgroud)

java2s上的更多机器人示例:( 链接)

  1. Robot:createScreenCapture(Rectangle screenRect)
  2. Robot:getPixelColor(int x,int y)
  3. 机器人:keyPress(int keycode)
  4. Robot:keyRelease(int keycode)
  5. 机器人:mouseMove(int x,int y)
  6. 机器人:mousePress(int按钮)
  7. 机器人:mouseRelease(int按钮)
  8. 机器人:mouseWheel(int wheelAmt)

使用C#.

有无数的解决方案.只需谷歌 " 测试自动化c# "或" 间谍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.          
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

  • (-.-)如果你需要详细说明一个问题,可以创建一个新问题...但是解决方案是"Shift +双击"(选择),"控制+ C"(复制)和"控制+ V" (粘贴)或使用剪贴板更改来调用事件. (2认同)