2012-12-12 154 views
3

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

任何有关此API的知识都将不胜感激。

+0

Java在监视*其他应用程序*中的活动时相当糟糕。你需要一些本地的操作系统级支持。 – Thilo

+0

我怀疑你需要编写一个与Windows GUI库集成的DLL,而不是Java。 –

+0

@Thilo Java的设计不会以对黑客有用的方式从其他应用程序获取数据。 ;) –

回答

5

您可以使用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 - 监控是高亮文本 - 堆栈溢出 - 谷歌浏览器]

目前在剪贴板:我为集思广益一个项目,我的一些想法m计划

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