java - 如何获取子窗口的所有标题?
问题描述
我有一个带有文本的窗口。当我在 Microsoft Spy++ 程序中找到此窗口时,此文本显示为其子窗口的标题。 我有这个代码:
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 paramHWND, int paramInt, WPARAM paramWPARAM, LPARAM paramLPARAM);
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 zavhwnd = com.sun.jna.platform.win32.User32.INSTANCE.FindWindow
(null, "ZAV - 1.0.05");
HWND editHwnd = user32.FindWindowExA(zavhwnd, null,
"WindowsForms10.RichEdit20W.app.0.2004eee", null);
byte[] lParamStr = new byte[512];
LRESULT resultBool = user32.SendMessageA(editHwnd, User32.WM_GETTEXT, 512, lParamStr);
System.out.println("string: "+Native.toString(lParamStr));
}
它找到了那个窗口(zavhwnd),因为它不为空,但我仍然无法阅读我想要的文本。如果它检索子窗口的所有标题会更好,因为“WindowsForms10.RichEdit20W.app.0.2004eee”类可能并不总是相同的。有人可以帮我吗?
解决方案
我已经找到了如何做到这一点:
interface ExtendedStdLib extends StdCallLibrary {
ExtendedStdLib INSTANCE = (ExtendedStdLib) Native.load("user32", ExtendedStdLib.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 paramHWND, int paramInt, WPARAM paramWPARAM, LPARAM paramLPARAM);
LRESULT SendMessageA(HWND editHwnd, int wmGettext, long l, byte[] lParamStr);
int GetClassNameA(HWND hWnd, byte[] lpString, int maxCount);
}
public void getSelectableText() {
ExtendedStdLib EXT_INSTANCE = ExtendedStdLib.INSTANCE;
HWND zavhwnd = User32.INSTANCE.FindWindow(null, "{Window Title}");
if (zavhwnd == null) {
log.error("Window wasn't found");
return;
}
User32.INSTANCE.EnumChildWindows(zavhwnd, (hwnd, pntr) -> {
char[] textBuffer = new char[512];
char[] textBuffer2 = new char[512];
User32.INSTANCE.GetClassName(hwnd, textBuffer, 512);
User32.INSTANCE.GetWindowText(hwnd, textBuffer2, 512);
String wText = Native.toString(textBuffer);
String wText2 = Native.toString(textBuffer2);
if (wText.contains("RichEdit")) {
byte[] lParamStr = new byte[2048];
LRESULT resultBool = EXT_INSTANCE.SendMessageA(hwnd, ExtendedStdLib.WM_GETTEXT, 2048, lParamStr);
String text = Native.toString(lParamStr, "windows-1250");
}
return true;
}, null);
}
推荐阅读
- react-native - 如何将谷歌支付(印度的支付应用程序)集成到本地反应中?
- c++ - 为什么STL“空”成员函数不叫“isEmpty”?
- json - .Net Core 从另一个控制器操作中获取 json 结果并将 json 字符串转换为 c# 对象
- javascript - JS/TS判断一个JSON对象是否实现了一个类或接口
- here-api - 高精度坐标德国地图的覆盖范围
- java - 如何在adwords api中获取关键字的总成本
- node.js - 在 Hyperledger 作曲家中特定天数后发出事件
- postgresql - 错误:列“increment_by”不存在 - Postgres 10 和 Navicat for Postgres
- geolocation - 哪个更适合我的位置流式传输场景?AWS Kinesis、SQS 还是其他?
- mysql - MYSQL 获取所选记录的上一条记录