gpt4 book ai didi

c++ - 是否有任何 IID_XXX 可以从 Internet Explorer 获取焦点选项卡?

转载 作者:塔克拉玛干 更新时间:2023-11-03 07:55:09 25 4
gpt4 key购买 nike

我正在做一个项目,我想在网络浏览器中当前访问的网页中注入(inject)一个脚本。我为此编写了以下代码。

        IDispatch *spDisp;
HRESULT hR;
IHTMLWindow2 *pWnd = NULL;
IWebBrowser2 *spBrowser = NULL;
IHTMLDocument2 *spDoc = NULL;
for (long i = 0; i < nCount; i++){
_variant_t va(i, VT_I4);
hR = m_spSHWinds->Item(va, &spDisp);
if(hR != S_OK)
continue;
hR =spDisp->QueryInterface(IID_IWebBrowser2, (void**)&spBrowser);
spDisp->Release();
if (hR == S_OK)
{
hR = spBrowser->get_LocationName(&str);
hR = spBrowser->get_LocationURL(&str);
hR = spBrowser->get_Document((IDispatch**)&spDisp);
hR = spDisp->QueryInterface(IID_IHTMLDocument2, (void**)&spDoc);
spDisp->Release();
if(hR == S_OK){
hR = spDoc->get_URL(&str);
}
}
}

这里的 m_spSHWindsIShellWindowsPtr m_spSHWinds; 的对象,并初始化为 m_spSHWinds.CreateInstance(__uuidof(ShellWindows));但问题是。它为我提供了 IE 浏览器中一系列选项卡中所有网页的句柄。但我只需要当前从所有选项卡中选择的选项卡。

谁能告诉我该怎么做?抱歉英语不好。

最佳答案

我会怎么做:

安装全局 WH_CALLWNDPROC钩子(Hook)。

在 Hook 过程中,筛选发送到类“Internet Explorer_Server”的 Windows 的消息,并筛选消息 WM_SETFOCUS .

当您检测到焦点事件时,使用 PostMessage使用 lParam 携带 HWND 向您的程序发出信号。这样做只是为了获得焦点,而不是失去焦点。

您将向其发送 PostMessage 的 HWND 可以通过 FindWindow 获知.它是您的主程序的窗口之一。

当心托管您的 Hook 的 IE 进程的低级完整性。在最新版本的 IE 和最新版本的 Windows 上,您的 PostMessage 可能会失败并出现错误“拒绝访问”。为了克服这个问题,你将不得不使用 ChangeWindowMessageFilterEx .警告:如果您的目标是 Windows Vista,则必须使用 ChangeWindowMessageFilter .处理这个问题的最佳方法是通过 GetProcAddress 动态查询 API 的可用性。在 user32.dll 上,从 Ex 版本开始,回退到旧版本。如果两者都不存在,请不要打扰,您使用的是 XP(或更低版本)。

您现在可以在主程序中存储最后聚焦的 IE 渲染窗口的 HWND,这应该适用于任何版本的 IE。

您可以将 WM_DESTROY 添加到您的钩子(Hook)过滤器,并通知您的主程序,因为您可能想要解决最后一个获得焦点的选项卡被关闭的情况。

当用户点击您的按钮时,使用“WM_HTML_GETOBJECT”注册窗口消息和ObjectFromLresult API 获取IHTMLDocument2 接口(interface)指针.参见 How to get IHTMLDocument2 from a HWND .

关于c++ - 是否有任何 IID_XXX 可以从 Internet Explorer 获取焦点选项卡?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20768947/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com