logo

自制Java工具:Ctrl+C+C快速翻译鼠标选中文本实践指南

作者:宇宙中心我曹县2025.09.19 13:11浏览量:3

简介:本文介绍如何通过Java实现一个自定义工具,监听Ctrl+C+C快捷键并翻译鼠标选中的文本,提升跨语言工作效率。

引言

在日常开发或办公场景中,频繁切换翻译工具查看外文资料会打断工作流。本文将通过Java实现一个轻量级工具,监听Ctrl+C+C组合键(避免与系统复制冲突),自动捕获鼠标选中文本并调用翻译API,实现无缝翻译体验。该方案适用于Windows/Linux/macOS,无需安装额外软件,适合开发者或跨语言办公场景。

一、技术选型与原理

1.1 核心组件

  • Java AWT/Swing:监听全局键盘事件与剪贴板操作
  • Robot类:模拟键盘输入(用于特殊场景)
  • HTTP客户端(如OkHttp):调用翻译API
  • 正则表达式:解析选中文本中的可翻译内容

1.2 工作原理

  1. 监听全局快捷键:通过GlobalScreen库(需jnativehook依赖)捕获Ctrl+C+C组合键。
  2. 获取选中文本:调用Toolkit.getDefaultToolkit().getSystemClipboard().getData(DataFlavor.stringFlavor)读取剪贴板内容。
  3. 文本预处理:过滤非文本内容(如图片),提取有效翻译段落。
  4. 调用翻译API:通过HTTP请求发送文本至翻译服务(如Google Translate免费接口或DeepL)。
  5. 结果显示:将翻译结果弹窗展示或写回剪贴板。

二、实现步骤

2.1 环境准备

  1. 依赖管理

    1. <!-- Maven依赖 -->
    2. <dependency>
    3. <groupId>com.github.kwhat</groupId>
    4. <artifactId>jnativehook</artifactId>
    5. <version>2.2.2</version>
    6. </dependency>
    7. <dependency>
    8. <groupId>com.squareup.okhttp3</groupId>
    9. <artifactId>okhttp</artifactId>
    10. <version>4.10.0</version>
    11. </dependency>
  2. 权限配置

    • Windows:需以管理员权限运行(监听全局事件需权限)。
    • Linux/macOS:需配置x11权限或通过sudo启动。

2.2 核心代码实现

2.2.1 监听快捷键

  1. import org.jnativehook.GlobalScreen;
  2. import org.jnativehook.NativeHookException;
  3. import org.jnativehook.keyboard.NativeKeyEvent;
  4. import org.jnativehook.keyboard.NativeKeyListener;
  5. public class HotkeyListener implements NativeKeyListener {
  6. private static boolean isCtrlPressed = false;
  7. @Override
  8. public void nativeKeyPressed(NativeKeyEvent e) {
  9. if (e.getKeyCode() == NativeKeyEvent.VC_CONTROL_L) {
  10. isCtrlPressed = true;
  11. } else if (isCtrlPressed && e.getKeyCode() == NativeKeyEvent.VC_C) {
  12. // 第二次按下Ctrl+C时触发
  13. translateSelectedText();
  14. isCtrlPressed = false;
  15. }
  16. }
  17. @Override
  18. public void nativeKeyReleased(NativeKeyEvent e) {
  19. if (e.getKeyCode() == NativeKeyEvent.VC_CONTROL_L) {
  20. isCtrlPressed = false;
  21. }
  22. }
  23. public static void registerGlobalHotkey() {
  24. try {
  25. GlobalScreen.registerNativeHook();
  26. GlobalScreen.addNativeKeyListener(new HotkeyListener());
  27. } catch (NativeHookException ex) {
  28. System.err.println("注册全局监听失败: " + ex.getMessage());
  29. }
  30. }
  31. }

2.2.2 获取选中文本

  1. import java.awt.*;
  2. import java.awt.datatransfer.*;
  3. public class ClipboardUtils {
  4. public static String getSelectedText() {
  5. try {
  6. Clipboard clipboard = Toolkit.getDefaultToolkit().getSystemClipboard();
  7. return (String) clipboard.getData(DataFlavor.stringFlavor);
  8. } catch (UnsupportedFlavorException | IOException e) {
  9. return null; // 非文本内容或获取失败
  10. }
  11. }
  12. }

2.2.3 调用翻译API(以Google Translate为例)

  1. import okhttp3.*;
  2. public class Translator {
  3. private static final String API_URL = "https://translate.googleapis.com/translate_a/single";
  4. private static final String API_KEY = "YOUR_API_KEY"; // 需替换为有效Key
  5. public static String translate(String text, String targetLang) throws IOException {
  6. OkHttpClient client = new OkHttpClient();
  7. RequestBody body = new FormBody.Builder()
  8. .add("q", text)
  9. .add("target", targetLang)
  10. .add("key", API_KEY)
  11. .build();
  12. Request request = new Request.Builder()
  13. .url(API_URL)
  14. .post(body)
  15. .build();
  16. try (Response response = client.newCall(request).execute()) {
  17. // 解析JSON响应(示例简化,实际需用JSON库)
  18. String json = response.body().string();
  19. // 假设返回格式为 {"data":{"translations":[{"translatedText":"..."}]}}
  20. return json.split("\"translatedText\":\"")[1].split("\"")[0];
  21. }
  22. }
  23. }

2.2.4 主程序集成

  1. import javax.swing.*;
  2. public class TranslationTool {
  3. public static void main(String[] args) {
  4. // 注册快捷键监听
  5. HotkeyListener.registerGlobalHotkey();
  6. // 显示系统托盘图标(可选)
  7. if (SystemTray.isSupported()) {
  8. SystemTray tray = SystemTray.getSystemTray();
  9. Image image = Toolkit.getDefaultToolkit().getImage("icon.png");
  10. PopupMenu menu = new PopupMenu();
  11. MenuItem exitItem = new MenuItem("退出");
  12. exitItem.addActionListener(e -> System.exit(0));
  13. menu.add(exitItem);
  14. TrayIcon trayIcon = new TrayIcon(image, "翻译工具", menu);
  15. trayIcon.addActionListener(e -> showHelpDialog());
  16. tray.add(trayIcon);
  17. }
  18. // 保持程序运行
  19. while (true) {
  20. try {
  21. Thread.sleep(1000);
  22. } catch (InterruptedException e) {
  23. e.printStackTrace();
  24. }
  25. }
  26. }
  27. private static void translateSelectedText() {
  28. String selectedText = ClipboardUtils.getSelectedText();
  29. if (selectedText != null && !selectedText.isEmpty()) {
  30. try {
  31. String translated = Translator.translate(selectedText, "zh-CN");
  32. JOptionPane.showMessageDialog(null, translated, "翻译结果", JOptionPane.INFORMATION_MESSAGE);
  33. } catch (IOException e) {
  34. JOptionPane.showMessageDialog(null, "翻译失败: " + e.getMessage(), "错误", JOptionPane.ERROR_MESSAGE);
  35. }
  36. }
  37. }
  38. private static void showHelpDialog() {
  39. JOptionPane.showMessageDialog(null, "按Ctrl+C+C翻译选中文本", "帮助", JOptionPane.INFORMATION_MESSAGE);
  40. }
  41. }

三、优化与扩展

3.1 性能优化

  • 异步处理:使用SwingWorker避免翻译API调用阻塞UI线程。
  • 缓存机制:对重复文本缓存翻译结果,减少API调用次数。
  • 节流控制:限制单位时间内翻译请求频率,避免触发API限流。

3.2 功能扩展

  • 多语言支持:通过配置文件动态加载目标语言。
  • OCR集成:结合Tesseract OCR识别图片中的文字。
  • 语音朗读:调用javax.speech实现翻译结果语音播报。

3.3 错误处理

  • 网络异常:捕获IOException并提供重试机制。
  • API密钥失效:检测HTTP 403错误并提示用户更新密钥。
  • 剪贴板冲突:处理IllegalStateException(如其他程序锁定剪贴板)。

四、部署与使用

  1. 打包为JAR

    1. <!-- Maven配置 -->
    2. <plugin>
    3. <groupId>org.apache.maven.plugins</groupId>
    4. <artifactId>maven-assembly-plugin</artifactId>
    5. <version>3.6.0</version>
    6. <configuration>
    7. <archive>
    8. <manifest>
    9. <mainClass>TranslationTool</mainClass>
    10. </manifest>
    11. </archive>
    12. <descriptorRefs>
    13. <descriptorRef>jar-with-dependencies</descriptorRef>
    14. </descriptorRefs>
    15. </configuration>
    16. </plugin>

    运行命令:java -jar translation-tool.jar

  2. 开机自启

    • Windows:创建快捷方式至%APPDATA%\Microsoft\Windows\Start Menu\Programs\Startup
    • Linux:添加@java -jar /path/to/translation-tool.jar~/.config/autostart/

五、替代方案对比

方案 优点 缺点
本工具(Java) 跨平台、可定制性强 需Java环境,内存占用较高
AutoHotkey 轻量级,无需编程 仅限Windows,功能扩展性有限
Electron应用 界面美观,支持复杂交互 打包体积大,启动速度慢

结论

本文实现的Java工具通过监听Ctrl+C+C快捷键,结合剪贴板操作与翻译API,提供了高效、无感的文本翻译体验。开发者可根据实际需求扩展功能(如添加OCR、语音支持),或将其集成至IDE插件中。对于非技术用户,建议使用打包后的JAR文件配合开机自启,实现“一键安装,永久使用”的便捷体验。

相关文章推荐

发表评论

活动