1

我目前正在用 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;
4

2 回答 2

1

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

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

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

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

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

于 2013-01-22T19:32:07.490 回答
0

当前窗口在所有 shell 窗口中位于 z 顺序的顶部,因此您可以枚举 shell 窗口并选择最上面的一个。请注意,shellwindows 也列出了 Windows Explorer 窗口,因此需要通过类名或可执行文件名过滤掉这些窗口。

参考:

自动化活动的 Windows Explorer 或 Internet Explorer 窗口

于 2013-01-22T21:53:05.703 回答