java - 使用 JNA 操作 'Internet Explorer_server' 中的 HTML 元素

标签 java jna

我正在使用 Java 创建一个自动登录应用程序,但在尝试使用 JNA 获取 Internet Explorer_Server 的 html 内容时陷入了死胡同。

其他编程语言(例如 Python 或 C#)中存在一些有关此问题的信息,但找不到如何在 Java 中执行此操作。人们正在使用 ObjectFromLresult 方法来获取 html 内容,但我在 Java 中找不到任何替代方法。 IHTMLDocument2 - click button inside 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);
}

请注意,上述链接文档指出:

This function is designed for internal use by Microsoft Active Accessibility and is documented for informational purposes only. Neither clients nor servers should call this function.

因此您不应依赖此 API 来获取生产代码。但假设您已经走到这一步,您需要将返回的指针强制转换为 IHTMLDocument2 interface 。这将是一个类似这样的类:

class IHTMLDocument2 extends IDispatch {
    public IHTMLDocument2() {
    }

    public IHTMLDocument2(Pointer p) {
        super(p);
    }

    // map function(s) here
}

为了映射该函数,您将定义一个 JNA 方法 matching the function signature in the header file它将包装一个 _invokeNativeObject() 调用,传递如下参数:

return (HRESULT) _invokeNativeObject(123,
                new Object[] { foo, bar }, HRESULT.class);

您将用 IHTMLDocument2Vtbl 中函数/方法的从 0 开始的索引替换 123头文件中的类。

关于java - 使用 JNA 操作 'Internet Explorer_server' 中的 HTML 元素,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58625932/

相关文章:

java - 如何使用 Jackson 获取嵌套 JsonNode 内的集合

java - 在 'normal' Java 应用程序和 Web 应用程序中运行良好的库关闭例程

java - jna Native.LoadLibrary 无法在服务器上加载库(在本地工作)

java - 如何使用 JNA 从结构中获取 Structure.ByReference?

java - 如何为每个正在执行的 Java 程序实现安全策略

java - 如果我终止 jUnit 测试会发生什么

java - 在 Word 文档中发现标题/段落

java - Netbeans 和 Selenium 入门

java - 确定文件是否为联结(在 Windows 中)?

android - Android 中使用的 C++ 库的最佳架构