我可以通过 XPCOM 列出 "MozillaWindowClass" HWND 的选项卡吗?

Can I list Tabs of a "MozillaWindowClass" HWND via XPCOM?

IE 提供从 IE 框架的 HWND 轻松访问 IWebBrowser2IHtmlDocument2 所以你EnumWindowsEnumChildWindows 然后测试 class,一旦找到合适的,就可以轻松地与它们互动。

If there a way to list all open Mozilla Firefox tabs in a "MozillaWindowClass" (having its HWND), via XPCOM and C++?

我用谷歌搜索了很长时间,但找不到关于这个主题的太多信息。我不想开发扩展/附加组件,但想从不相关的 EXE(而不是扩展 DLL)外部控制浏览器。或者至少对它有一些只读访问权限。

You can not use C++/XPCOM with Firefox externally like you use COM with IE, you can only use C++/XPCOM from within a binary component of your extension. So you won't be able to do it without writing an extension, and at that point it's easier to listen on tab events from JS and notify your binary component.

请注意,在 FF 中支持二进制组件是一个 PITA,因此我不建议您在没有充分理由的情况下走这条路。

但是,一旦你有了扩展和二进制组件,从选项卡获取 HWND 的方法就是这样(希望它仍然有效,我们停止支持 FF 许多版本之前):

static HWND GetWndHandle(nsIXULWindow * window) {
    HWND hwnd = NULL;

    nsCOMPtr<nsIDocShell> docshell;
    nsresult res = window->GetDocShell(getter_AddRefs(docshell));

    if(NS_SUCCEEDED(res)) {
        nsCOMPtr<nsIBaseWindow> basewnd(do_QueryInterface(docshell));

        if(basewnd) {
            res = basewnd->GetParentNativeWindow((nativeWindow*)&hwnd);
            if(NS_FAILED(res)) hwnd = NULL;
        }
    }

    return hwnd;
}

有了这个和来自 JS 的通知,您的二进制组件可以通过 HWND 提供查找选项卡并用它做一些事情。