java - 使用 JNA 在“Internet Explorer_server”中操作 HTML 元素
问题描述
我正在使用 Java 创建一个自动登录应用程序,并在尝试使用 JNA 获取 Internet Explorer_Server 的 html 内容时走到了死胡同。
在其他编程语言(如 Python 或 C#)中有一些关于此问题的信息,但找不到如何在 Java 中执行此操作。人们正在使用 ObjectFromLresult 方法来获取 html 内容,但我在 Java 中找不到任何替代方法。 IHTMLDocument2 - 点击 iframe 内的按钮
我成功连接到窗口并可以发送 WM_HTML_GETOBJECT 消息,但我不知道如何从 LResult 获取 html 内容。
WinDef.HWND hWnd = user32.FindWindow("ADALWebBrowserHost","");
if(hWnd != null){
ieServer = hWnd;
while(!ieServerFound) {
getIEServer gies = new getIEServer();
user32.EnumChildWindows(ieServer, gies, null);
}
int msg = user32.RegisterWindowMessage("WM_HTML_GETOBJECT");
WinDef.DWORDByReference dbr = new WinDef.DWORDByReference();
WinDef.LRESULT result = user32.SendMessageTimeout(ieServer, msg, new WinDef.WPARAM(0),new WinDef.LPARAM(0), WinUser.SMTO_ABORTIFHUNG,1000, dbr);
// HTML ObjectFromLresult?
}
有没有办法将 LResult 转换为 Java 中的某种 HTML 对象数组?
解决方案
您需要将ObjectFromLresult函数映射到 JNA。它目前不在用户提供的jna-platform
库中。
您需要定义一个Oleacc
类以从oleacc.dll
该函数所在的库中获取,并映射该函数。
public interface Oleacc extends StdCallLibrary, WinUser {
public static final Oleacc INSTANCE =
(Oleacc)Native.loadLibrary("oleacc", Oleacc.class, W32APIOptions.DEFAULT_OPTIONS);
HRESULT ObjectFromLresult(WinDef.LRESULT lResult, Guid.REFIID riid, WinDef.WPARAM wParam,
PointerByReference ppvObject);
}
请注意,上述链接文档指出:
此功能专供 Microsoft Active Accessibility 内部使用,仅供参考。客户端和服务器都不应调用此函数。
所以你不应该依赖这个 API 来生产代码。但是假设您已经走到了这一步,您需要将返回的 Pointer 强制转换为IHTMLDocument2
interface。那将是一个有点像这样的类:
class IHTMLDocument2 extends IDispatch {
public IHTMLDocument2() {
}
public IHTMLDocument2(Pointer p) {
super(p);
}
// map function(s) here
}
为了映射函数,您将在头文件中定义一个与函数签名匹配的 JNA 方法,该方法将包装一个_invokeNativeObject()
传递参数的调用,如下所示:
return (HRESULT) _invokeNativeObject(123,
new Object[] { foo, bar }, HRESULT.class);
您将在头文件的IHTMLDocument2Vtbl类中将123 替换为函数/方法的从 0 开始的索引。
推荐阅读
- python - 使用 AES 加密时的字节问题
- file-upload - 在vue js,元素ui上传组件中上传之前调整大小/压缩图像
- python-3.x - Python 3 - 当满足要求时,While 循环不会跳出循环
- laravel - Laravel 7外键约束格式不正确
- javascript - 如何验证表单中的电话号码:JavaScript
- javascript - 在第一行有行跨度的情况下,在表的第一行设置 css 样式 - 多表
- laravel - 404在laravel 6中找不到
- firebase - 测量 Firebase 的事件持续时间
- python - 如何将 Keras-Gaussian 噪声添加到图像数据中
- php - 多对多关系的 EntityType