【问题标题】:Can I list Tabs of a "MozillaWindowClass" HWND via XPCOM?我可以通过 XPCOM 列出“MozillaWindowClass”HWND 的选项卡吗?
【发布时间】:2015-01-06 15:53:45
【问题描述】:
IE 提供从 IE 框架的 HWND 轻松访问 IWebBrowser2 和 IHtmlDocument2。 所以你 EnumWindows 和 EnumChildWindows 然后你测试这个类一旦找到合适的人,您就可以轻松地与他们互动。
如果有办法通过XPCOM 和 C++ 列出 "MozillaWindowClass" 中所有打开的 Mozilla Firefox 选项卡(有其 HWND)? p>
我已经用谷歌搜索了很长时间,但在这个主题上找不到太多。我不想开发扩展/附加组件,但想从不相关的 EXE 外部控制浏览器,而不是从扩展 DLL。或者至少对它有一些只读访问权限。
【问题讨论】:
标签:
c++
firefox
xpcom
geckosdk
【解决方案1】:
你不能在外部使用 C++/XPCOM 和 Firefox,就像你使用 COM 和 IE 一样,你只能在扩展的二进制组件中使用 C++/XPCOM。 所以你不会'不编写扩展就无法做到这一点,此时更容易监听来自 JS 的选项卡事件并通知您的二进制组件。
请注意,在 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 查找选项卡并对其进行处理。