连接到运行的IE实例C ++

时间:2013-01-22 17:03:09

标签: c++ internet-explorer com

我目前正在AutoIt编写程序,但我想将一些函数外包给C ++,因为它更安全。我设法创建一个IE并导航到一个站点。

但那不是我需要的。我正在AutoIt中创建IE实例,用C ++编写的部分必须连接到此IE并导航到特定页面。

现在它是一个C ++应用程序,但是稍后,当一切运行正常时,我将创建一个.Dll并用AutoIt调用它。所以我可以传递像hWnd这样的值。

我想有充分理由这样做,所以请不要问我为什么要这样做。

有人知道如何管理吗?提前谢谢。

    CoInitialize(NULL);
IWebBrowser2* pBrowser = NULL;
HRESULT hr = CoCreateInstance(CLSID_InternetExplorer, NULL, 
    CLSCTX_SERVER, IID_IWebBrowser2, (LPVOID*)&pBrowser);

if (SUCCEEDED(hr) && (pBrowser != NULL))
{
    VARIANT vEmpty;
    VariantInit(&vEmpty);

    VARIANT vFlags;
    V_VT(&vFlags) = VT_I4;
    V_I4(&vFlags) = navOpenInNewWindow;

    BSTR bstrURL = SysAllocString(L"http://www.ard.de");

    pBrowser->Navigate(bstrURL, &vFlags, &vEmpty, &vEmpty, &vEmpty);
    pBrowser->Quit();

    SysFreeString(bstrURL);
}
if (pBrowser)
    pBrowser->Release();
CoUninitialize();
return 0;

2 个答案:

答案 0 :(得分:1)

您发布的代码会创建一个新的IE(选项卡)实例,这不是您想要的。您想要连接到现有实例,为此您必须使用不同的方法。

首先创建一个IShellWindows实例。该对象是shell窗口注册表的接口(例如Windows资源管理器或IE)。

你可以做两件事:你可以订阅它的事件,并在用户打开和关闭窗口时收到通知;您还可以枚举当前窗口。

您使用IShellWindows的{​​{3}}和get_Count()方法枚举当前窗口。此枚举将为您提供IDispatch接口,然后您可以QueryInterface()IWebBrowser2接口(如果失败则跳过,而不是IE)。请注意,您可能仍然获得不是IE的窗口,因此可能需要更多过滤。

从这里你可以尝试找出它是否是你正在寻找的窗口。

答案 1 :(得分:0)

当前窗口位于所有shell窗口中z顺序的顶部,因此您可以枚举shell窗口并选择顶部窗口。请注意,shellwindows也会列出Windows资源管理器窗口,因此需要通过类名或可执行文件名来过滤掉这些窗口。

参考:

Automate the Active Windows Explorer or Internet Explorer Window