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

时间:2010-10-25 13:43:23

标签: c# java text-capture

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

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

1 个答案:

答案 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类,为此。

  

此类用于生成本机   用于此目的的系统输入事件   测试自动化,自运行   演示和其他应用程序   控制鼠标和键盘是   需要。机器人的主要目的   是为了方便自动化测试   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

  1. Robot:createScreenCapture(Rectangle screenRect)
  2. Robot:getPixelColor(int x,int y)
  3. Robot:keyPress(int keycode)
  4. Robot:keyRelease(int keycode)
  5. Robot:mouseMove(int x,int y)
  6. Robot:mousePress(int buttons)
  7. Robot:mouseRelease(int buttons)
  8. Robot:mouseWheel(int wheelAmt)
  9. 使用C#。

    无数的解决方案。只需谷歌link”或“Test Automation c#”。

    MSDN:spy c#
    MSDN:SendKeys

    您可以使用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.          
            }
        }
    }