需求:用戶在任意應用(記事本、瀏覽器、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) {}
}
}
}
<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>
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);
}
}