【问题标题】:How To Capture Text Using Mouse Pointer And Keyboard Shortcuts?如何使用鼠标指针和键盘快捷键捕获文本?
【发布时间】:2011-04-30 05:33:57
【问题描述】:

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

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

【问题讨论】:

    标签: c# java text-capture


    【解决方案1】:

    使用脚本语言创建你想要做的草稿。

    您可以使用 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 类,可以做到这一点。

    该类用于生成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)

    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#。

    无数种解决方案。只需 googleTest 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.          
            }
        }
    }
    

    【讨论】:

    • 感谢您的帮助,请提供有关使用 java 和 c# 的更多详细信息。
    • 感谢 Margus,这是关于如何管理关键事件的问题的第一部分的解决方案,但第二部分是:如何阅读鼠标指针下的文本(一个单词)并发送它到我的应用程序?
    • (-.-) 如果您需要详细说明问题,请创建一个新问题...但简化的解决方案是 Shift+double click(select)、Control+C(copy) 和 @987654341 @(paste) 或使用剪贴板更改来调用事件。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-04-05
    • 2012-02-07
    • 2014-07-25
    • 2012-07-05
    • 1970-01-01
    • 2011-08-01
    相关资源
    最近更新 更多