监控突出显示的文本

这更像是一个假设的问题,我正在为我正在计划的项目集思广益,如果有人知道任何API或方法可以立即在任何窗口上获取任何突出显示的文本,例如从浏览器或文字处理器。 它也可能有一个只能在按下时读取的键命令(类似于CTRL + C将所选文本添加到剪贴板)

任何有关API的知识都将非常感激。

您可以使用JNA在前台窗口上实际模拟Ctrl-C (复制操作),然后读取剪贴板中的内容,之后您只需要恢复剪贴板中的内容。

这是一个简短的样本:

 import java.awt.Toolkit; import java.awt.datatransfer.Clipboard; import java.awt.datatransfer.ClipboardOwner; import java.awt.datatransfer.DataFlavor; import java.awt.datatransfer.StringSelection; import java.awt.datatransfer.Transferable; import com.sun.jna.Native; import com.sun.jna.platform.win32.User32; import com.sun.jna.platform.win32.WinDef.HWND; import com.sun.jna.win32.StdCallLibrary; public class Foo implements ClipboardOwner { public interface CustomUser32 extends StdCallLibrary { CustomUser32 INSTANCE = (CustomUser32) Native.loadLibrary("user32", CustomUser32.class); HWND GetForegroundWindow(); void keybd_event(byte bVk, byte bScan, int dwFlags, int dwExtraInfo); } public void lostOwnership(Clipboard clipboard, Transferable contents) { // dummy: needed for `ClipboardOwner` } void controlC(CustomUser32 customUser32) { customUser32.keybd_event((byte) 0x11 /* VK_CONTROL*/, (byte) 0, 0, 0); customUser32.keybd_event((byte) 0x43 /* 'C' */, (byte) 0, 0, 0); customUser32.keybd_event((byte) 0x43 /* 'C' */, (byte) 0, 2 /* KEYEVENTF_KEYUP */, 0); customUser32.keybd_event((byte) 0x11 /* VK_CONTROL*/, (byte) 0, 2 /* KEYEVENTF_KEYUP */, 0);// 'Left Control Up } String getClipboardText() throws Exception { return (String) Toolkit.getDefaultToolkit().getSystemClipboard().getData(DataFlavor.stringFlavor); } void setClipboardText(String data) throws Exception { Toolkit.getDefaultToolkit().getSystemClipboard().setContents(new StringSelection(data), this); } String getSelectedText(User32 user32, CustomUser32 customUser32) throws Exception { HWND hwnd = customUser32.GetForegroundWindow(); char[] windowText = new char[512]; user32.GetWindowText(hwnd, windowText, 512); String windowTitle = Native.toString(windowText); System.out.println("Will take selected text from the following window: [" + windowTitle + "]"); String before = getClipboardText(); controlC(customUser32); // emulate Ctrl C Thread.sleep(100); // give it some time String text = getClipboardText(); System.out.println("Currently in clipboard: " + text); // restore what was previously in the clipboard setClipboardText(before); return text; } public static void main(String[] args) throws Exception { Foo foo = new Foo(); Thread.sleep(2000); // take some time for you to select something anywhere System.out.println(foo.getSelectedText(User32.INSTANCE, CustomUser32.INSTANCE)); } } 

当你运行它时,你将有两秒钟在任何应用程序的某处选择一些文本,然后它通常会打印它。

将从以下窗口中选择文本:[java – 监视突出显示的文本 – Stack Overflow – Google Chrome]

目前在剪贴板中:我正在为我正在计划的项目集思广益

你不需要接受我的答案,只是为了告诉你我在上面的评论中所说的话。