Как получить элемент iframe в родительском документе из дочернего документа в междоменном iframe?

У меня есть этот код, который будет делать обратное: получает дочерний документ с iframe element:

var htmlWindow = (element as IHTMLFrameBase2).contentWindow;
if (htmlWindow == null) return null;
// Convert IHTMLWindow2 to IWebBrowser2 using IServiceProvider.
IServiceProvider sp = (IServiceProvider)htmlWindow;
// Use IServiceProvider.QueryService to get IWebBrowser2 object.
Object brws = null;
//brws = 
sp.QueryService(ref IID_IWebBrowserApp, ref IID_IWebBrowser2, out brws);
// Get the document from IWebBrowser2.
SHDocVw.IWebBrowser2 browser = (SHDocVw.IWebBrowser2)(brws);
return (IHTMLDocument2)browser.Document;

У меня вопрос, как я могу сделать обратное? Я пытался сделать это, учитывая ребенка document но я получаю ноль frameWindow:

Object frameWindow;
IServiceProvider isp = (IServiceProvider)document.parentWindow;
isp.QueryService(ref IID_IWebBrowserApp, ref IID_IHTMLFrameBase, out frameWindow);

Вот все GUID для вашей справки:

private static Guid IID_IWebBrowserApp = new Guid("0002DF05-0000-0000-C000-000000000046");
private static Guid IID_IWebBrowser2 = new Guid("D30C1661-CDAF-11D0-8A3E-00C04FC9E26E");
private static Guid IID_IHTMLFrameBase2 = new Guid("3050F6DB-98B5-11CF-BB82-00AA00BDCE0B");
private static Guid IID_IHTMLFrameBase = new Guid("3050F311-98B5-11CF-BB82-00AA00BDCE0B");
private static Guid IID_IHTMLWindow2 = new Guid("332C4427-26CB-11D0-B483-00C04FD90119");

А вот мой IServiceProvider:

[ComImport(), ComVisible(true), Guid("6D5140C1-7436-11CE-8034-00AA006009FA"),
InterfaceTypeAttribute(ComInterfaceType.InterfaceIsIUnknown)]
private interface IServiceProvider
{
    [return: MarshalAs(UnmanagedType.I4)]
    [PreserveSig]
    int QueryService(ref Guid guidService, ref Guid riid, [MarshalAs(UnmanagedType.Interface)] out object ppvObject);
}

1 ответ

Ну, на самом деле вы не сможете получить документ / элементы Iframe из основного браузера. Вы должны выполнить Javascript. В моем случае у меня был удачный jquery, доступный на моем целевом веб-сайте, поэтому я использовал следующий экспресс, чтобы получить текст из одного из внутренних iframe.

Я сделал это:

   var tmp = browser.Document.InvokeScript("eval", new object[] { "$(\"#iframe_id\").contents().find('#element').html())" });

В вашем случае, если вы действительно хотите что-то сделать с html какого-то элемента внутри целевого iframe, тогда вам нужно аккуратно захватить его html, а затем создать пустой элемент в главном окне браузера и обновить его html с помощью того, который вы взяли и сделали ваши вещи.

Это единственный способ, который я нашел до сих пор.

Другие вопросы по тегам