logo

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

作者:Nicky2025.09.19 13:12浏览量:1

简介:本文介绍如何使用Java开发一个实用工具,通过自定义快捷键Ctrl+C+C实现鼠标选中文本的即时翻译功能,提升跨语言工作效率。

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

引言

在全球化办公场景中,跨语言文本处理已成为高频需求。传统翻译方式需手动复制文本、切换翻译软件、粘贴内容,操作繁琐且效率低下。本文将介绍如何通过Java开发一个轻量级工具,实现通过自定义快捷键Ctrl+C+C快速翻译鼠标选中文本的功能,显著提升跨语言工作效率。

需求分析与设计目标

核心功能需求

  1. 实时文本捕获:当用户用鼠标选中任意窗口的文本时,工具需立即获取选中的内容。
  2. 快捷键触发:通过自定义快捷键Ctrl+C+C(区别于系统默认的Ctrl+C)触发翻译流程。
  3. 翻译服务集成:调用在线翻译API(如Google Translate、DeepL等)获取翻译结果。
  4. 结果展示:以弹窗或悬浮窗形式显示翻译结果,支持复制到剪贴板。

设计目标

  • 轻量化:工具应独立运行,不依赖浏览器或其他软件。
  • 低延迟:从文本捕获到翻译结果展示的响应时间应控制在1秒内。
  • 跨平台:支持Windows、macOS和Linux系统。
  • 可扩展性:支持添加更多翻译服务或自定义快捷键。

技术实现方案

1. 文本捕获实现

Java本身不直接支持全局文本捕获,但可通过以下方式实现:

  • Windows平台:使用JNA(Java Native Access)调用Windows API GetForegroundWindowGetWindowText 获取活动窗口标题,再通过 SendInput 模拟Ctrl+C复制选中内容。
  • 跨平台方案:使用Robot类模拟键盘操作(Ctrl+C),但需确保目标窗口处于活动状态。

代码示例(Windows文本捕获)

  1. import com.sun.jna.platform.win32.*;
  2. public class TextCapture {
  3. public static String getSelectedText() {
  4. try {
  5. // 模拟Ctrl+C操作
  6. Robot robot = new Robot();
  7. robot.keyPress(KeyEvent.VK_CONTROL);
  8. robot.keyPress(KeyEvent.VK_C);
  9. robot.keyRelease(KeyEvent.VK_C);
  10. robot.keyRelease(KeyEvent.VK_CONTROL);
  11. // 从剪贴板获取文本
  12. Clipboard clipboard = Toolkit.getDefaultToolkit().getSystemClipboard();
  13. return (String) clipboard.getData(DataFlavor.stringFlavor);
  14. } catch (Exception e) {
  15. e.printStackTrace();
  16. return null;
  17. }
  18. }
  19. }

2. 快捷键监听

使用Java的GlobalScreen库(需安装JIntellitype或JNativeHook)监听全局快捷键:

  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 boolean isCtrlPressed = false;
  7. @Override
  8. public void nativeKeyPressed(NativeKeyEvent e) {
  9. if (e.getKeyCode() == NativeKeyEvent.VC_CONTROL) {
  10. isCtrlPressed = true;
  11. } else if (isCtrlPressed && e.getKeyCode() == NativeKeyEvent.VC_C) {
  12. // 第二次Ctrl+C触发翻译
  13. String text = TextCapture.getSelectedText();
  14. if (text != null) {
  15. String translated = Translator.translate(text, "en", "zh");
  16. Notification.show(translated);
  17. }
  18. isCtrlPressed = false;
  19. }
  20. }
  21. @Override
  22. public void nativeKeyReleased(NativeKeyEvent e) {
  23. if (e.getKeyCode() == NativeKeyEvent.VC_CONTROL) {
  24. isCtrlPressed = false;
  25. }
  26. }
  27. }

3. 翻译服务集成

以Google Translate API为例(需申请API Key):

  1. import java.net.URI;
  2. import java.net.http.HttpClient;
  3. import java.net.http.HttpRequest;
  4. import java.net.http.HttpResponse;
  5. public class Translator {
  6. private static final String API_KEY = "YOUR_API_KEY";
  7. private static final String URL = "https://translation.googleapis.com/language/translate/v2";
  8. public static String translate(String text, String sourceLang, String targetLang) {
  9. String requestBody = String.format(
  10. "{\"q\":\"%s\",\"source\":\"%s\",\"target\":\"%s\",\"key\":\"%s\"}",
  11. text, sourceLang, targetLang, API_KEY
  12. );
  13. HttpClient client = HttpClient.newHttpClient();
  14. HttpRequest request = HttpRequest.newBuilder()
  15. .uri(URI.create(URL))
  16. .header("Content-Type", "application/json")
  17. .POST(HttpRequest.BodyPublishers.ofString(requestBody))
  18. .build();
  19. try {
  20. HttpResponse<String> response = client.send(request, HttpResponse.BodyHandlers.ofString());
  21. // 解析JSON获取翻译结果(此处简化,实际需用JSON库)
  22. return response.body().split("\"translatedText\":\"")[1].split("\"")[0];
  23. } catch (Exception e) {
  24. e.printStackTrace();
  25. return "翻译失败";
  26. }
  27. }
  28. }

4. 结果展示

使用Java Swing创建悬浮窗:

  1. import javax.swing.*;
  2. import java.awt.*;
  3. public class Notification {
  4. public static void show(String text) {
  5. JFrame frame = new JFrame();
  6. frame.setUndecorated(true);
  7. frame.setAlwaysOnTop(true);
  8. frame.setType(Window.Type.POPUP);
  9. frame.setBackground(new Color(0, 0, 0, 0));
  10. JLabel label = new JLabel(text);
  11. label.setFont(new Font("微软雅黑", Font.PLAIN, 16));
  12. frame.add(label);
  13. frame.pack();
  14. frame.setLocationRelativeTo(null);
  15. frame.setVisible(true);
  16. // 3秒后自动关闭
  17. new Timer(3000, e -> frame.dispose()).start();
  18. }
  19. }

完整工具集成

将上述模块整合到主类中:

  1. public class TranslationTool {
  2. public static void main(String[] args) {
  3. try {
  4. GlobalScreen.registerNativeHook();
  5. } catch (NativeHookException ex) {
  6. System.err.println("无法注册全局快捷键监听");
  7. System.exit(1);
  8. }
  9. GlobalScreen.addNativeKeyListener(new HotkeyListener());
  10. JOptionPane.showMessageDialog(null, "翻译工具已启动,按Ctrl+C+C翻译选中文本");
  11. }
  12. }

部署与优化建议

  1. 打包为可执行文件:使用Launch4j或jpackage将工具打包为.exe或.app文件,方便分发。
  2. 配置文件管理:将API Key、目标语言等参数存储在配置文件中,避免硬编码。
  3. 错误处理:添加网络异常、API限制等场景的容错机制。
  4. 性能优化
    • 使用线程池处理翻译请求,避免阻塞UI。
    • 添加缓存机制,减少重复翻译。
  5. 扩展功能
    • 支持OCR识别图片中的文字。
    • 添加语音朗读功能。

实际应用场景

  1. 技术文档阅读:快速翻译英文技术文档中的关键段落。
  2. 跨团队协作:与海外团队沟通时即时翻译聊天内容。
  3. 学习辅助:阅读外文资料时快速理解难点。
  4. 客户支持:为国际客户提供多语言支持。

总结

本文详细介绍了如何使用Java开发一个通过Ctrl+C+C快捷键翻译鼠标选中文本的工具。通过结合全局快捷键监听、剪贴板操作和在线翻译API,实现了高效、便捷的跨语言文本处理方案。该工具具有轻量化、低延迟和跨平台的特点,可显著提升跨语言工作效率。开发者可根据实际需求进一步扩展功能,如添加更多翻译服务、支持OCR识别等。

相关文章推荐

发表评论

活动