自制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());}
}

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

关于鸿蒙的笔记整理

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 一、关于样式1 . 默认单位 vp2 . 写公共样式 二 、 加载图片三 、 父子组件传值四 、 自定义构建函数 Builder五、构建函数-BuilderParam 传递UI 一、关于样式 1 .…

Java中请求生成唯一追溯TraceId

Java中请求生成唯一追溯TraceId 一&#xff1a;背景 因为是微服务架构,平常日志太多,看日志不太好查,所以想要从一整个链路当中获取一个唯一标识,比较好定位问题&#xff0c; 原理就是从gateway网关将标识传递到下游,下游服务拿到这个标识,响应结束后将traceId反向写入响应体…

[论文笔记] Megtron_LM 0、报错:vscode调试无法传进去参数 launch.json文件获取args参数

解决方法&#xff1a; 配置好launch.json文件后&#xff0c;应该点运行和调试里面的运行按钮。而不是直接点文件右上角的debug。 可以看到terminal中&#xff0c;如果没有正常加载launch.json&#xff0c;则参数中没有args的参数。 如果正常加载&#xff0c;可以看到args的很多…

匿名内部类为什么泄漏,Lambda为什么不泄漏(案例不涉及持外部引用的情况,即:只分析匿名内部类和Lambda内部类情况)

theme: channing-cyan 在Android开发中&#xff0c;内存泄露发生的场景其实主要就两点&#xff0c;一是数据过大的问题&#xff0c;而是调用与被调用生命周期不一致问题&#xff0c;对于对象生命周期不一致导致的泄漏问题占90%&#xff0c;最常见的也不好分析的当属匿名内部类…

Java中的IO与NIO篇----第四篇

系列文章目录 文章目录 系列文章目录前言一、NIO 的非阻塞二、Channel三、Buffer四、Selector前言 前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。点击跳转到网站,这篇文章男女通用,看懂了就去分享给你的码吧。 一、NIO 的非阻塞 I…

Java:HeapMemory和DirectMemory配置与使用介绍

目录 一、Heap内存 1、查看Heap内存配置的最大值 2、配置Heap内存最大值的方式 3、配置Heap内存最小值的方式 4、查看已使用Heap内存的方式 5、查看未使用Heap内存的方式 二、Direct内存 1、查看Direct内存配置的最大值 2、配置Direct内存最大值的方式 3、获取Direct…

C++ OpenGL 3D GameTutorial 1:Making the window with win32 API学习笔记

视频地址https://www.youtube.com/watch?vjHcz22MDPeE&listPLv8DnRaQOs5-MR-zbP1QUdq5FL0FWqVzg 一、入口函数 首先看入口函数main代码&#xff1a; #include<OGL3D/Game/OGame.h>int main() {OGame game;game.Run();return 0; } 这里交代个关于C语法的问题&#x…

释放创造力:可视化页面渲染引擎在低代码开发平台的应用

本文由葡萄城技术团队发布。转载请注明出处&#xff1a;葡萄城官网&#xff0c;葡萄城为开发者提供专业的开发工具、解决方案和服务&#xff0c;赋能开发者。 什么是页面渲染引擎? 页面渲染引擎是低代码开发平台的核心组件之一&#xff0c;它负责将开发者设计的页面布局和用户…

计算机网络学习笔记(5)——运输层

本文继续整理计算机网络体系架构知识内容。今日主讲——运输层。 网络层只把分组发送到目的主机&#xff0c;但是真正通信的并不是主机而是主机中的进程。 运输层提供了应用进程间的逻辑通信。运输层向高层用户屏蔽了下面网络层的核心细节&#xff0c;使应用程序看 见的好像在两…

python+selenium爬虫笔记

本文只是做例子&#xff0c;具体网站路径麻烦你们换下&#xff0c;还有xpath路径也换下 一、安装所需要的组件&#xff08;此处采用谷歌&#xff09; 1、安装驱动 查看你的浏览器版本&#xff0c;去安装对应的版本 下载驱动 下载驱动路径 之前版本的 输入这个路径下载下来解压…

js api scrollIntoView

前言 今天记录一个非常常用的js api scrollIntoView 它可以轻易的让目标元素滚动到可视范围之内&#xff0c;而无需手动计算偏移量 一、用法 document.querySelector(.dept-title).scrollIntoView()二、参数 scrollIntoView() scrollIntoView(boolean) 默认为 true&#xf…

TikTok革新游戏规则:解读短视频对社交媒体的影响

在社交媒体的巨浪中&#xff0c;TikTok以其独特的短视频形式和强大的创意社区&#xff0c;重新定义了游戏规则。这个以15秒视频为核心的平台&#xff0c;不仅让用户获得了表达自我的新方式&#xff0c;更深刻地影响了社交媒体的演进。本文将深入解读TikTok对社交媒体的影响&…

支持下载和阅读的漫画管理工具Teemii

什么是 Teemii &#xff1f; Teemii 是一款专为狂热漫画读者设计的精简 Web 应用程序。它为阅读和管理漫画集提供了一个简单而高效的平台。主要功能包括跨平台访问、浏览器内阅读、强大的元数据聚合器以及馆藏自动更新。Teemii 是专为那些寻求更加个性化和自主的方法来管理漫画…

[Kubernetes]4. 借助腾讯云TKE快速创建Pod、Deployment、Service部署k8s项目

前面讲解了通过命令行方式来部署k8s项目,下面来讲讲通过腾讯云TKE来快速创建Pod、Deployment、Service部署k8s项目,云平台搭建Kubernetes可参考[Kubernetes]1.Kubernetes(K8S)介绍,基于腾讯云的K8S环境搭建集群以及裸机搭建K8S集群 一.通过腾讯云TKE创建集群 1.创建集群 参考上…

Kibana 自定义索引连接器告警

一、 创建索引 PUT ipu-cbs-warning-info{"settings" : {"number_of_shards" : 1},"mappings" : {"properties" : {"timestamp": {"type": "date"},"rule_id" : { "type" : "…

经纬度的作用

当我们在手机上使用导航软件或者在网上查找地址时&#xff0c;经常会发现一个选项&#xff0c;就是显示当前位置的经纬度。那么&#xff0c;什么是经纬度&#xff0c;它有什么作用呢&#xff1f; 经纬度是用来确定地球上任何一个点位置的坐标系统。它由两个数值组成&#xff0…

spring常用注解(一)springbean生命周期类

一、PostConstruct&#xff1a; 被PostConstruct修饰的方法会在服务器加载Servlet的时候运行&#xff0c;并且只会被服务器调用一次&#xff0c;类似于servlet的inti()方法。被PostConstruct修饰的方法会在构造函数之后&#xff0c;init()方法之前运行。

网站内链和外链接的作用分析

一、浅谈内链与分析内链的作用 大家都知道网站内容的重要性&#xff0c;但很多站长还是停留在只更新网站内容等程度上。却忽视了做网站内链的作用。   网站内链的目的是为了更好的让搜索引擎抓取网站的内容&#xff01;和突出网站关键字的特点&#xff01;还有就是文章关键…

tomcat、java、maven

JDK&#xff5c;JRE Tomcat官网介绍的更清楚 Java 环境安装 安装 wget https://builds.openlogic.com/downloadJDK/openlogic-openjdk/8u392-b08/openlogic-openjdk-8u392-b08-linux-x64.tar.gz tar -xf openlogic-openjdk-8u392-b08-linux-x64.tar.gz mv openlogic-openjdk…

【完整流程】实现STM32+ESP8266+MQTT+阿里云+APP——【第二节-编写STM32程序初步实现ESP8266上云发布订阅消息】

&#x1f31f;博主领域&#xff1a;嵌入式领域&人工智能&软件开发 前言&#xff1a;本节实现&#xff0c;硬件连接STM32与ESP8266&#xff0c;编写STM32程序通过at命令方式实现STM32ESP8266与阿里云物联网平台发布订阅消息&#xff0c;本节最终实现初步的发布订阅消息…