自制java工具实现 ctrl+c+c 翻译鼠标选中文本

前言

本功能的实现基于这篇笔记 http://t.csdnimg.cn/1I8ln,本文阅读过程中有疑惑都可以查看此笔记

实现思路:检测到按压ctrl +c +c 后,获取当前剪切板文字,调用百度翻译api。

实现结果:

GIF.gif

完整代码在最后

实现过程

1 监控ctrl +c +c

在当前demo的功能中我们可以看到,当按压键盘时会调用nativeKeyPressed方法,并会打印当前按下的按钮字符串。
image.png
我们去掉一些打印的干扰:去除release和type的打印,以及press打印的前缀
image.png
此时就只会打印我们的按键
image.png
现在去实现:当连续按压ctrl+c+c时,打印"你按下了ctrl+c+c哦"
思路:初始设置一个key字符串为"“,当检测到按压ctrl时,设置key为"Ctrl”,当不是Ctrl时,key拼接本次按压的按键,然后和"CtrlCC"做比较。如果相同,则说明用户连续按压了ctrl+c+c;
代码实现(红框内为添加的代码):
image.png
效果:
image.png

2 获取剪切板内容

在我们进行ctrl+c+c的操作过程中,第一个ctrl+c就会将鼠标选择的内容放到剪切板里,此时我们获取剪切板的内容,之后再用这个内容调用翻译api即可。
创建一个剪切板工具类

/**
 * 剪切板工具类
 */
public class ClipBoardUtil {
    public static String getClipboardText() {
        Clipboard clipboard = Toolkit.getDefaultToolkit().getSystemClipboard();
        //从系统剪切板中获取数据
        Transferable content = clipboard.getContents(null);
        //判断是否为文本类型
        if (content.isDataFlavorSupported(DataFlavor.stringFlavor)) {
            //从数据中获取文本值
            String text = null;
            try {
                text = (String) content.getTransferData(DataFlavor.stringFlavor);
            }  catch (Exception e) {

            }
            if (text == null) {
                return "剪切板为空";
            }
            return text;
        }
        return "剪切板无文本值";
    }
}

在代码中调用:
image.png
效果:
image.png

3 调用百度翻译api

注册账号,开通服务

搜索百度翻译开放平台,注册账号,实名认证后,可以申请高级版用户
标准版:注册,未实名
高级版:注册,实名
尊享版:企业认证
image.png
高级版每个月有100万字符的免费调用量,对于个人使用的话绰绰有余了。
注册后,在管理控制台中开通文本翻译服务

详细见文档
image.png

根据文档,编写代码

image.png
其中appid和密钥,在我们的管理控制台中
image.png
以下是调用方法的代码实现,我们创建一个TransApi

import cn.hutool.crypto.digest.DigestUtil;
import cn.hutool.http.HttpUtil;

import java.util.HashMap;
import java.util.Map;

public class TransApi {
    private static final String TRANS_API_HOST = "http://api.fanyi.baidu.com/api/trans/vip/translate";
    private String appid;
    private String securityKey;

    /**
     * 有参构造
     * @param appid appid
     * @param securityKey 密钥
     */
    public TransApi(String appid, String securityKey) {
        this.appid = appid;
        this.securityKey = securityKey;
    }
    
    /**
     * 调用方法
     * @param query 翻译内容
     * @param from 来源语言
     * @param to 翻译语言
     * @return 返回参数
     */	
    public String getTransResult(String query, String from, String to) {
        Map<String, Object> params = this.buildParams(query, from, to);
        return HttpUtil.get("http://api.fanyi.baidu.com/api/trans/vip/translate", params);
    }

    /**
     * 初始化参数
     * @param query 翻译内容
     * @param from 来源语言
     * @param to 翻译语言
     * @return
     */
    private Map<String, Object> buildParams(String query, String from, String to) {
        Map<String, Object> params = new HashMap();
        params.put("q", query);
        params.put("from", from);
        params.put("to", to);
        params.put("appid", this.appid);
        String salt = String.valueOf(System.currentTimeMillis());
        params.put("salt", salt);
        String src = this.appid + query + salt + this.securityKey;
        //MD5加密
        params.put("sign", DigestUtil.md5Hex(src));
        return params;
    }
}

其中调用接口的HttpUtil和加密的DigestUtil使用的是hutool中的类
hutool包的地址:

<dependency>
  <groupId>cn.hutool</groupId>
  <artifactId>hutool-all</artifactId>
  <version>5.8.24</version>
</dependency>

ctrl+c+c获取剪切板内容并调用翻译接口

GlobalKeyListenerExample类中添加TransApi类的初始化:
image.png
在获取剪切板内容后,将剪切板的内容调用翻译接口,并处理返回数据
image.png

运行效果

image.png
我们看到这里,已经初步完成了ctrl+c+c进行翻译的功能,剩下的就是进行一些小优化,如生成窗口展示数据

4 小窗口展示剪切板内容和翻译内容

因为笔者对java的gui窗口不是很了解,这里使用chatgpt工具生成了小窗口,可能有些简陋,读者可以自己美化一下
新建一个MyWindows

import javax.swing.*;
import java.awt.*;

public class MyWindow extends JFrame {

    private JTextArea textArea;

    public MyWindow() {
        setTitle("Text Window");
        setSize(400, 300);
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

        textArea = new JTextArea();
        //设置字体大小
        textArea.setFont(new Font("SimSun", Font.PLAIN, 16));
        // 自动换行
        textArea.setLineWrap(true);
        // 断行不断字
        textArea.setWrapStyleWord(true);
        JPanel panel = new JPanel();

        setVisible(true);
        add(textArea, "Center");
        add(panel, "South");
    }

    //写入文本
    public void writeText(String text) {
        textArea.append(text + "\n");
    }
    //清楚文本
    public void clearText() {
        textArea.setText("");
    }

    public static void main(String[] args) {
        MyWindow window = new MyWindow();
        window.setVisible(true);
    }
}

GlobalKeyListenerExample类中初始化MyWindow:
image.png
在获取翻译后,清除原来的文字,写入新的文字:
image.png
运行:

完整代码

ClipBoardUtil类,TransApi类,MyWindow类上文已給出完整代码。
GlobalKeyListenerExample类:


import cn.hutool.core.text.UnicodeUtil;
import cn.hutool.json.JSONObject;
import cn.hutool.json.JSONUtil;
import com.github.kwhat.jnativehook.GlobalScreen;
import com.github.kwhat.jnativehook.NativeHookException;
import com.github.kwhat.jnativehook.keyboard.NativeKeyEvent;
import com.github.kwhat.jnativehook.keyboard.NativeKeyListener;
import com.icepeach.Utils.ClipBoardUtil;
import com.icepeach.Utils.GUI.MyWindow;


public class GlobalKeyListenerExample implements NativeKeyListener {
    String key = "";
    private static final String APP_ID = "你的appid";
    private static final String SECURITY_KEY = "你的密钥";
    TransApi api = new TransApi(APP_ID, SECURITY_KEY);
    MyWindow window = new MyWindow();

    public void nativeKeyPressed(NativeKeyEvent e) {


        if ("Ctrl".equals(NativeKeyEvent.getKeyText(e.getKeyCode()))) {
            key = new String("Ctrl");
        } else {
            key += NativeKeyEvent.getKeyText(e.getKeyCode());
        }

        if ("CtrlCC".equals(key)) {
            window.setVisible(true);
            //打印剪切板内容
            System.out.println("剪切板内容为:" + ClipBoardUtil.getClipboardText());
            //调用翻译接口
            String jsonStr = api.getTransResult(ClipBoardUtil.getClipboardText(), "auto", "zh");
            // 解析JSON字符串
            JSONObject jsonObject = JSONUtil.parseObj(jsonStr);
            // 获取trans_result数组中的第一个元素
            JSONObject transResult = jsonObject.getJSONArray("trans_result").getJSONObject(0);
            // 获取dst中的内容并转换成中文
            String dst = transResult.getStr("dst");
            String chineseDst = UnicodeUtil.toString(dst);

            System.out.println("翻译:"+chineseDst);


            window.clearText();
            window.writeText("剪切板内容为:" + ClipBoardUtil.getClipboardText());
            window.writeText("翻译:"+chineseDst);

        }
        if (e.getKeyCode() == NativeKeyEvent.VC_ESCAPE) {
            try {
                GlobalScreen.unregisterNativeHook();
            } catch (NativeHookException nativeHookException) {
                nativeHookException.printStackTrace();
            }
        }
    }

    public void nativeKeyReleased(NativeKeyEvent e) {
//        System.out.println("Key Released: " + NativeKeyEvent.getKeyText(e.getKeyCode()));
    }

    public void nativeKeyTyped(NativeKeyEvent e) {
//        System.out.println("Key Typed: " + e.getKeyText(e.getKeyCode()));
    }

    public static void main(String[] args) {
        try {
            GlobalScreen.registerNativeHook();
        } catch (NativeHookException ex) {
            System.err.println("There was a problem registering the native hook.");
            System.err.println(ex.getMessage());

            System.exit(1);
        }

        GlobalScreen.addNativeKeyListener(new GlobalKeyListenerExample());
    }
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/293735.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

文心一言 VS 讯飞星火 VS chatgpt (172)-- 算法导论13.3 1题

一、用go语言&#xff0c;在 RB-INSERT 的第 16 行&#xff0c;将新插人的结点 z 着为红色。注意到&#xff0c;如果将 z 着为黑色&#xff0c;则红黑树的性质4就不会被破坏。那么为什么不选择将 z 着为黑色呢? 文心一言&#xff1a; 在红黑树中&#xff0c;节点被着色为红色…

高可用/高可用的微服务架构设计-资源隔离、限流、熔断、降级、监控

断路器模式 舱壁隔离模式 容错理念 凡是依赖都可能会失败 凡是资源都有限制 CPU/Memory/Threads/Queue 网络并不可靠&#xff0c;延迟是应用稳定性杀手 1 资源隔离 让你的系统里&#xff0c;某一块东西&#xff0c;在故障的情况下&#xff0c;不会耗尽系统所有的资源&#xff0…

(leetcode)判断字符是否唯一 -- 使用位图(位运算)

个人主页&#xff1a;Lei宝啊 愿所有美好如期而遇 目录 本题链接 输入描述 输出描述 算法分析 算法一&#xff1a;哈希表 算法二&#xff1a;位运算(位图) 解题源码 本题链接 力扣&#xff08;LeetCode&#xff09; 输入描述 接口&#xff1a;bool isUnique(st…

洛谷 P1873 砍树 (二分 简单)

【二分答案】是分治的一种&#xff0c;这类问题很经典&#xff0c;接下来几篇文章会关于二分答案相关的文章&#xff0c;希望同学们可以完成10道以上的【二分答案】相关问题&#xff0c;以此来加深对【二分答案】这类问题的个人理解。 原公众号链接&#xff1a;分治第二讲&…

Vue知识总结-上

VUE初识 Vue是一套用于构建用户界面的渐进式(由只需要轻量小巧的核心库构建的简单应用逐渐扩展为可以引入各式各样的Vue组件构建的复杂应用)JavaScript框架 Vue需掌握的内容&#xff1a;Vue基础、Vue-cli、vue-router、vuex、element-ui、vue3 Vue特点 采用组件化模式、提高代…

AIGC初探:提示工程 Prompt Engineering

简介 提升工程是什么 提示工程&#xff08;Prompt Engineering&#xff09;是人工智能领域中的一个概念&#xff0c;特别是在自然语言处理&#xff08;NLP&#xff09;领域中。它是一种通过设计和优化输入提示来提高AI模型表现的方法。 对于基于转换器的大型语言模型&#x…

金智维KRPA问题集锦

KRPA问题集锦 1、打开浏览器错误 &#xff08;1&#xff09;浏览器插件问题&#xff0c;需要正确安装ChromePlug插件&#xff0c; &#xff08;2&#xff09;windows系统下需要正确配置chrome.exe运行环境变量

代码随想录算法训练营第十五天| 二叉树 513. 找树左下角的值 112. 路径总和 106.从中序与后序遍历序列构造二叉树

513. 找树左下角的值 层序遍历 本题用层序遍历可以直接秒了&#xff0c;直接提取每一层中最左边的元素&#xff08;i0&#xff09;&#xff0c;然后保存到最后一层即可。 class Solution { public:int findBottomLeftValue(TreeNode* root) {queue<TreeNode*> que;int…

Apache Camel笔记

Apache Camel笔记 1. Apache Camel概念 Apache Camel是一个轻量级的应用集成开发框架&#xff0c;专注于简化集成应用的开发。它基于Enterprise Integration Patterns&#xff08;企业集成模式&#xff0c;简称EIP&#xff09;的设计理念&#xff0c;提供了灵活的路由和中介机制…

【愚公系列】2023年12月 HarmonyOS教学课程 015-ArkUI组件(Radio)

&#x1f3c6; 作者简介&#xff0c;愚公搬代码 &#x1f3c6;《头衔》&#xff1a;华为云特约编辑&#xff0c;华为云云享专家&#xff0c;华为开发者专家&#xff0c;华为产品云测专家&#xff0c;CSDN博客专家&#xff0c;CSDN商业化专家&#xff0c;阿里云专家博主&#xf…

docker容器添加新的端口映射

通常在运行容器时&#xff0c;我们都会通过参数 -p来指定宿主机和容器端口的映射&#xff0c;例如 docker run -it -d --restart always --name [指定容器名] -p 8899:8080 [指定镜像名]上述命令将容器内的8080端口映射到宿主机的8899端口。 参数说明 -d 表示后台运行容器 -t…

【springboot+vue项目(十一)】springboot整合EasyExcel

EasyExcel是阿里巴巴开源的一个Java库&#xff0c;用于操作Excel文件。它提供了简单易用的API&#xff0c;可以读取、写入和转换Excel文件&#xff0c;支持大量数据的导入和导出操作。 一、添加依赖&#xff08;版本3.2&#xff09; <!--easyexcel操作excel--> <depe…

Unity 点击对话系统(含Demo)

点击对话系统 可实现点击物体后自动移动到物体附近&#xff0c;然后弹出对话框进行对话。 基于Unity 简单角色对话UI脚本的编写&#xff08;新版UI组件&#xff09;和Unity 关于点击不同物品移动并触发不同事件的结合体&#xff0c;有兴趣可以看一下之前文章。 下边代码为U…

014、枚举与模式匹配

枚举类型&#xff0c;通常也被简称为枚举&#xff0c;它允许我们列举所有可能的值来定义一个类型。在本篇文章中&#xff0c;我们首先会定义并使用一个枚举&#xff0c;以向你展示枚举是如何连同数据来一起编码信息的。 接着&#xff0c;我们会讨论一个特别有用的枚举&#xff…

figma导入psd实战笔记

最近发现figma特别好用 并且插件生态特别庞大 如 将设计图转成vue react react-native 项目 flutter 项目 最重要的是 可以集成vscode 插件使用 使用蓝湖久了 感觉蓝湖 有写繁琐 同事扩展功能有限 Figma: The Collaborative Interface Design ToolFigma is the leading collabo…

上帝视角俯视工厂设计模式

引言 本篇聊聊设计模式中的简单工厂、工厂方法、抽象工厂设计模式&#xff0c;争取在看完这篇后不会再傻傻分不清以及能够应用在实际项目中 背景 以一个咱们都熟悉的场景举个例子&#xff0c;我们平时都会戴口罩&#xff0c;用来过滤一些普通病毒&#xff0c;大致的设计如下…

电脑记事本怎么打开?电脑记事本打开方法

在日常工作中&#xff0c;许多上班族都习惯于使用电脑记事本记录重要事项、灵感想法或临时任务。电脑记事本轻便、简洁&#xff0c;能够为我们提供便捷的记事体验。那么电脑记事本怎么打开呢&#xff1f;电脑记事本打开方法是什么呢&#xff1f;在Windows电脑上&#xff0c;我们…

手把手教你用Python打造一个语音合成系统

目录 引言 一、了解语音合成技术 1.1 什么是语音合成技术 1.2 语音合成技术的分类 二、准备所需工具和库 2.1 Python编程语言 2.2 TensorFlow深度学习框架 2.3 WaveNet模型 三、搭建语音合成系统 3.1 数据准备 3.2 数据预处理 3.3 构建WaveNet模型 3.4 训练WaveNe…

京东年度数据报告-2023全年度净水器十大热门品牌销量榜单

近年来&#xff0c;随着科技的不断发展和应用&#xff0c;净水器的技术得到持续创新和提高&#xff0c;产品品质和使用效果不断优化&#xff0c;这也进一步提升了净水器的市场竞争力&#xff0c;2023年&#xff0c;净水器市场的销售成绩呈现增长。 根据鲸参谋平台的数据显示&a…

大语言模型占显存的计算和优化

可以优化的地方&#xff1a; per_device_train_batch_size&#xff08;相当于batch size&#xff0c;越小显存占的越小&#xff09; gradient_accumulation_steps&#xff08;per_device_train_batch_size*gradient_accumulation_steps计算梯度的数据数&#xff09; gradien…