首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計綜合問答

Java 獲取滑鼠選中的文本內容:系統剪貼板監聽 + JNA 掛鉤,兩種方案詳解

     編輯:程式設計綜合問答

需求:用戶在任意應用(記事本、瀏覽器、IDE)用滑鼠選中文本並複製(Ctrl+C),Java 程式實時獲取該文本。

方案一:輪詢系統剪貼板(最簡單、跨平台)

import java.awt.Toolkit;
import java.awt.datatransfer.Clipboard;
import java.awt.datatransfer.DataFlavor;

public class ClipboardWatcher {
    public static void main(String[] args) throws Exception {
        Clipboard cb = Toolkit.getDefaultToolkit().getSystemClipboard();
        String last = "";
        while (true) {
            Thread.sleep(500);
            try {
                String cur = (String) cb.getData(DataFlavor.stringFlavor);
                if (!cur.equals(last)) {
                    last = cur;
                    System.out.println("捕獲: " + cur);
                }
            } catch (Exception ignored) {}
        }
    }
}

優缺點

  • 優:純 Java、無需原生庫、跨 Windows/Linux/macOS。
  • 缺:延遲 0.5s、無法區分「選中未複製」與「複製」、若用戶頻繁複製其他內容會干擾。

方案二:JNA 掛鉤 Windows 鉤子(實時、可捕獲選中未複製)

依賴

<dependency>
    <groupId>net.java.dev.jna</groupId>
    <artifactId>jna</artifactId>
    <version>5.13.0</version>
</dependency>
<dependency>
    <groupId>net.java.dev.jna</groupId>
    <artifactId>jna-platform</artifactId>
    <version>5.13.0</version>
</dependency>

核心代碼(僅 Windows)

import com.sun.jna.platform.win32.*;
import com.sun.jna.platform.win32.WinUser.*;

public class MouseSelectionHook {
    private static HHOOK hook;
    private static WinUser.LowLevelMouseProc mouseProc = new WinUser.LowLevelMouseProc() {
        public LRESULT callback(int nCode, WPARAM wParam, LPARAM lParam) {
            if (nCode >= 0 && wParam.intValue() == WinUser.WM_LBUTTONUP) {
                // 左鍵釋放,嘗試獲取選區文本
                String selected = getSelectedTextViaClipboard(); // 發送 Ctrl+C 組合鍵或用 UI Automation
                if (selected != null && !selected.isEmpty()) {
                    System.out.println("選中文本: " + selected);
                }
            }
            return User32.INSTANCE.CallNextHookEx(hook, nCode, wParam, lParam);
        }
    };
    
    private static String getSelectedTextViaClipboard() {
        // 發送 Ctrl+C 到前台窗口,再讀剪貼板(需處理焦點、延遲)
        // 生產環境建議用 UI Automation (IUIAutomation) 直接讀取 TextPattern
        return null; // 略
    }
    
    public static void main(String[] args) {
        hook = User32.INSTANCE.SetWindowsHookEx(WinUser.WH_MOUSE_LL, mouseProc, Kernel32.INSTANCE.GetModuleHandle(null), 0);
        // 消息泵保持
        int result;
        MSG msg = new MSG();
        while ((result = User32.INSTANCE.GetMessage(msg, null, 0, 0)) != 0) {
            User32.INSTANCE.TranslateMessage(msg);
            User32.INSTANCE.DispatchMessage(msg);
        }
        User32.INSTANCE.UnhookWindowsHookEx(hook);
    }
}

進階:UI Automation 直接讀選區(無需模擬 Ctrl+C)

  • 用 `IUIAutomation::ElementFromPoint` 獲取滑鼠下元素。
  • 嘗試 `TextPattern` → `GetSelection()` → `GetText()`。
  • 支援 Chrome/Edge/Firefox/Notepad++/VS Code 等現代應用。

建議

  • 僅需「複製後獲取」 → 方案一輪詢剪貼板足夠。
  • 需「選中即獲取、不依賴複製」 → 方案二 + UI Automation,但開發成本高、僅限 Windows。
  • 跨平台方案:Electron + `clipboard.readText()` + 全局快捷鍵,再通過 IPC 傳給 Java 進程。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved