我可以使用Java从另一个窗口读取文本吗?

时间:2019-01-24 18:17:34

标签: java

我最近发现了应用程序Textify,该应用程序可以在任何窗口上复制无法选择的文本并将其保存到剪贴板。是否有任何Java库可以为您提供例如从另一个窗口读取所有文本?或者像API这样的东西可以做到这一点?

1 个答案:

答案 0 :(得分:0)

当然可以。您可以使用Java Native Access(JNA)来实现您的目标:https://github.com/java-native-access/jna

这是示例代码:

interface User32 extends StdCallLibrary {        
    User32 INSTANCE = (User32) Native.loadLibrary("user32", User32.class);
    int WM_SETTEXT = 0x000c;
    int WM_GETTEXT = 0x000D;

    HWND FindWindowA(String lpClassName, String lpWindowName);
    HWND FindWindowExA(HWND hwndParent, HWND hwndChildAfter, String lpClassName, String lpWindowName);
    LRESULT SendMessageA(HWND editHwnd, int wmGettext, long l, byte[] lParamStr);
    int GetClassNameA(HWND hWnd, byte[] lpString, int maxCount);
}

public static void main(String[] args) {
    User32 user32 = User32.INSTANCE;
    HWND notePadHwnd = user32.FindWindowA(null , "About Calculator");
    HWND editHwnd = user32.FindWindowExA(notePadHwnd, null, "SysLink", null); 
    byte[] lParamStr = new byte[512];
    user32.SendMessageA(editHwnd, User32.WM_GETTEXT, 512, lParamStr);

    System.out.println("Text from external window: " + Native.toString(lParamStr));
 }

enter image description here

,输出为:

Text from external window: This product is licensed under the <A>Microsoft Software License Terms</A> to:

当然,您可以使用此库做更多的事情。 Spy ++工具可能有用,并且对c / c ++有所了解。您还应该检查WinApi文档。