Изменение агента пользователя управления WebBrowser

Новый API был добавлен после iOS 7, что должно обеспечить эффективный способ получения снимка

  • snapshotViewAfterScreenUpdates: визуализирует представление в UIView с неизменяемым content

  • resizableSnapshotViewFromRect:afterScreenUpdates:withCapInsets: то же самое, но с изменяемыми размерами вставок

  • drawViewHierarchyInRect:afterScreenUpdates:: то же самое, если вам нужны все подпредставления нарисованные тоже (например, метки, кнопки ...)

Вы можете использовать UIView для любого эффекта пользовательского интерфейса или визуализировать изображение, как вы сделали, если вам нужно экспортировать .

Я не знаю, насколько хорошо этот новый метод работает по сравнению с предоставленным вами (хотя я помню инженеров Apple, которые говорили, что этот новый API был более эффективным)

44
задан clami219 23 July 2017 в 13:17
поделиться

1 ответ

Я не уверен, следует ли мне просто скопировать / вставить с веб-сайта , но я лучше оставлю здесь ответ, а не ссылку. Если кто-нибудь может уточнить в комментариях, я буду очень признателен.

По сути, вам нужно расширить класс WebBrowser.

public class ExtendedWebBrowser : WebBrowser
{
    bool renavigating = false;

    public string UserAgent { get; set; }

    public ExtendedWebBrowser()
    {
        DocumentCompleted += SetupBrowser;

        //this will cause SetupBrowser to run (we need a document object)
        Navigate("about:blank");
    }

    void SetupBrowser(object sender, WebBrowserDocumentCompletedEventArgs e)
    {
        DocumentCompleted -= SetupBrowser;
        SHDocVw.WebBrowser xBrowser = (SHDocVw.WebBrowser)ActiveXInstance;
        xBrowser.BeforeNavigate2 += BeforeNavigate;
        DocumentCompleted += PageLoaded;
    }

    void PageLoaded(object sender, WebBrowserDocumentCompletedEventArgs e)
    {

    }

    void BeforeNavigate(object pDisp, ref object url, ref object flags, ref object targetFrameName,
        ref object postData, ref object headers, ref bool cancel)
    {
        if (!string.IsNullOrEmpty(UserAgent))
        {
            if (!renavigating)
            {
                headers += string.Format("User-Agent: {0}\r\n", UserAgent);
                renavigating = true;
                cancel = true;
                Navigate((string)url, (string)targetFrameName, (byte[])postData, (string)headers);
            }
            else
            {
                renavigating = false;
            }
        }
    }
}

Примечание: Чтобы использовать метод выше, вам нужно добавить ссылку COM на «Microsoft Internet Элементы управления ».

Он также упоминает ваш подход и заявляет, что элемент управления WebBrowser, похоже, кэширует эту строку пользовательского агента, поэтому он не изменит пользовательский агент без перезапуска процесса.

35
ответ дан 26 November 2019 в 21:47
поделиться
Другие вопросы по тегам:

Похожие вопросы: