首页 > 解决方案 > 使用 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 对象数组?

标签: javajna

解决方案


您需要将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 强制转换为IHTMLDocument2interface。那将是一个有点像这样的类:

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 开始的索引。


推荐阅读