Как добраться к свойствам рисунка на странице в WebBrowser

Язык Visual Basic на платформе .NET.

Модераторы: Ramzes, Sebas

euroflock
Обычный пользователь
Обычный пользователь
 
Сообщения: 68
Зарегистрирован: 26.02.2009 (Чт) 12:54

Как добраться к свойствам рисунка на странице в WebBrowser

Сообщение euroflock » 17.03.2009 (Вт) 17:04

Вопросы возникают по мере и появления...

1. Подскажите, пожалуйста, как получить свойства рисунка (.TagName .GetAttribute .Name и т.д.), щёлкнув по нему мышкой (левой кнопкой)?
Дело в том, что рисунок на странице не получает фокус (за исключением случаев, когда фокус получает ссылка, на которую указывает рисунок) и, соответственно, нет возможности увидеть всё необходимое через .Document.ActiveElement

В двух словах, не принимая во внимание километры не относящегося к теме кода, есть форма с браузером WebBrowser1, текстовым полем TextBox1 и таймером Timer1.

А теперь самое главное: поставив мышкой фокус (клик правой, левой или средней кнопкой) на любой объект загруженной в браузер странички я без проблем получаю в текстовом поле перечень всех необходимых атрибутов выделенного объекта (таймер с интервалом например 500 нужен для того, чтобы не отлавливать события щелчка мышкой или переходы между элементами клавишами табуляции и др., а для обработки последнего выделенного объекта):
Код: Выделить всё
TextBox1.Text &= WebBrowser1.Document.ActiveElement.GetAttribute("type") & vbCrLf 'тип
TextBox1.Text &= WebBrowser1.Document.ActiveElement.GetAttribute("value") & vbCrLf 'значение элемента
TextBox1.Text &= WebBrowser1.Document.ActiveElement.Name & vbCrLf 'имя элемента
TextBox1.Text &= WebBrowser1.Document.ActiveElement.TagName & vbCrLf 'имя тэга элемента
TextBox1.Text &= WebBrowser1.Document.ActiveElement.InnerHtml & vbCrLf 'внутритэговский html
TextBox1.Text &= WebBrowser1.Document.ActiveElement.OuterHtml 'и т.д.


Такое дело (получение свойств HTML-элемента для их последующей обработки) получается не со всеми элементами на странице в браузере. Основная задача - это достучаться к свойствам выведенного на страничку рисунка, описанного тэгом <IMG .. />, чтобы получить его атрибуты, щелкнув по нему левой кнопкой мышки (ведь по правой кнопке почти всегда есть возможность сохранить этот рисунок и т.п.):
Код: Выделить всё
'здесь TargetImage - это как раз искомый объект с тэгом <IMG../>, на котором был щелчёк мышкой
DIM imgTYPE As String = TargetImage.GetAttribute("type")
DIM imgSCR As String = TargetImage.GetAttribute("scr")
DIM imgALT As String = TargetImage.GetAttribute("alt")
DIM imgTAG As String = TargetImage.TagName
DIM imgName As String = TargetImage.Name
DIM imgOUTERhtml As String = TargetImage.OuterHtml
DIM imgINNERtext As String = TargetImage.InnerText
'и т.д.

Как такое организовать?

Чувствую, что не скоро кто-нибудь откликнется... Все необходимые свойства рисунка получил через:
Код: Выделить всё
Dim TargetImage As HtmlElement = WebBrowser1.Document.GetElementFromPoint(pt)

а координаты - через перехват события .onmousedown в виде:
Код: Выделить всё
Public WithEvents Wb1 As New mshtml.HTMLDocument
.
.
Private Function Wb1_click() As Boolean Handles Wb1.onmousedown
        Dim x, y As Integer
        x = Wb1.parentWindow.event.x
        y = Wb1.parentWindow.event.y
        Dim pt As Point
        pt.X = x
        pt.Y = y
        Dim TargetImage As HtmlElement = WebBrowser1.Document.GetElementFromPoint(pt)
        .
        .


2. А может у кого-нибудь будут мысли по поводу того, каким образом программно вызвать и выполнить процедуру "Сохранить Изображение ..." (аналог нажатия правой кнопки мыши в браузере на рисунке)?

Где эта процедура описывается и как её можно вызвать учитывая, что TargetImage (As HtmlElement) уже получен, а остается лишь задать путь для сохранения картинки на диск?

Нашёл некоторые способы, наиболее приемлемый по всей видимости для моей ситуации следующий:
Код: Выделить всё
        Dim elem As HtmlElement = WebBrowser1.Document.GetElementFromPoint(pt)
        Dim element As mshtml.IHTMLImgElement = Wb1.elementFromPoint(x, y) ' координаты получаем так же, как описано выше
        Dim render As mshtml.IHTMLElementRender = element
        Dim bmp As Bitmap = New Bitmap(elem.ClientRectangle.Width, elem.ClientRectangle.Height)
        Using gr As Graphics = Graphics.FromImage(bmp)
            Dim hdc As IntPtr = gr.GetHdc
            render.DrawToDC(hdc)
            gr.ReleaseHdc()
        End Using
        bmp.Save("c:\image01.bmp")
        bmp.Dispose()


в строке
Код: Выделить всё
            render.DrawToDC(hdc)
высвечивается ошибка Value of type 'System.IntPtr' cannot be converted to 'mshtml._RemotableHandle'. Как избавиться от ошибки? Вероятнее всего не хватает кода, который я не смог правильно "перевести" на VB.NET:
private void saveWebpageBMP(WebBrowser wb)
{
// Get the renderer for the document body
IHTMLDocument2 doc = (IHTMLDocument2)wb.Document.DomDocument;
IHTMLElement body = (IHTMLElement)doc.body;
IHTMLElementRender render = (IHTMLElementRender)body;
// Render to bitmap
Bitmap bmp = new Bitmap(wb.ClientSize.Width, wb.ClientSize.Height);
using (Graphics gr = Graphics.FromImage(bmp)) {
IntPtr hdc = gr.GetHdc();
render.DrawToDC(hdc);
gr.ReleaseHdc();
}
bmp.Save(this.imagePath);
// Cleanup
bmp.Dispose();
}
// Replacement for mshtml imported interface, Tlbimp.exe generates wrong signatures
[ComImport, InterfaceType((short)1), Guid("3050F669-98B5-11CF-BB82-00AA00BDCE0B")]
private interface IHTMLElementRender {
void DrawToDC(IntPtr hdc);
void SetDocumentPrinter(string bstrPrinterName, IntPtr hdc);
}


Тогда я добавил:
Код: Выделить всё
    Private Interface IHTMLElementRender
        Property DrawToDC(ByVal hdc As IntPtr) As Boolean
        Property SetDocumentPrinter(ByVal bstrPrinterName As String, ByVal hdc As IntPtr) As Boolean
    End Interface

но ошибка не уходит... что делать?


Другие пишут: You could query for IHTMLElementRender interface and then call DrawToDC to paint the image into a memory DC. Having the image in a memory DC, is then easy to save it to disk. Может кто подскажет, как такое реализовать?


Дальше - больше... I get RetrieveUrlCacheEntryFile from wininet.dll but either I'm not getting it right in managed code through the pinvoke thingy, or I'm using it wrong, but it's returning the file-not-found error code for each call. RetrieveUrlCacheEntryFile. Гораздо "теплее", но опять же: как реализовать?


' select the entire document
WebBrowser1.ExecWB OLECMDID_SELECTALL, OLECMDEXECOPT_DODEFAULT
' copy the text to Clipboard
WebBrowser1.ExecWB OLECMDID_COPY, OLECMDEXECOPT_DODEFAULT
' clear the selection
WebBrowser1.ExecWB OLECMDID_CLEARSELECTION, OLECMDEXECOPT_DONTPROMPTUSER
' save as dialog
WebBrowser1.ExecWB OLECMDID_SAVEAS, OLECMDEXECOPT_PROMPTUSER, 0, 0



Хоть кто-нибудь подскажите куда двигаться! Я не просто сижу и жду от вас готового кода...


On Error Resume Next
Dim eQuery As OLECMDF
eQuery = WebBrowser1.QueryStatusWB(OLECMDID_SAVEAS)
If Err.Number = 0 Then
If eQuery And OLECMDF_ENABLED Then
WebBrowser1.ExecWB OLECMDID_SAVEAS, OLECMDEXECOPT_PROMPTUSER, "", ""
Else
MsgBox "You must load page or picture before saving", vbCritical, "Error message"
End If
End If

Williams
Гуру
Гуру
Аватара пользователя
 
Сообщения: 1280
Зарегистрирован: 06.05.2008 (Вт) 18:35
Откуда: System.Reflection.Williams (увидел себя в зеркале :))

Re: Как добраться к свойствам рисунка на странице в WebBrowser

Сообщение Williams » 20.03.2009 (Пт) 20:24

По-твоему вопросу в личку.
Пропиши у своего текстового поля ID и сделай FindElementById, потом GetAttribute
И вы думаете, что вас оставят в живых после прочтения этого поста?

euroflock
Обычный пользователь
Обычный пользователь
 
Сообщения: 68
Зарегистрирован: 26.02.2009 (Чт) 12:54

Re: Как добраться к свойствам рисунка на странице в WebBrowser

Сообщение euroflock » 02.05.2009 (Сб) 1:49

Williams писал(а):По-твоему вопросу в личку.
Пропиши у своего текстового поля ID и сделай FindElementById, потом GetAttribute


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

Это касается не только предыдущего поста, автора которого я лично уважаю (по умолчанию, пока нет повода для обратного), но и других разных постов, типа мол "я не знаю (или уже забыл), но ты лучше в гугле поищи", прежде чем нас тут тревожить...

Неужели непонятно, что если кто-то решился задать вопрос на всеобщее обозрание (я имею в виду именно здесь), то он уже перелопатил множество источников и не смог найти вразумительного ответа. Я более чем уверен, что ВСЕ спрашивающие в наибольшей степени рассчитывают на ответы тех, кто точно их знает...

Отдельно хочу обратить внимание на Nord777 и от себя лично поблагодарить его. Он всегда старается помочь, подсказать и никогда не оставит страждущего от кусочка спасительного кода.

izogif
Начинающий
Начинающий
 
Сообщения: 1
Зарегистрирован: 29.04.2010 (Чт) 17:04

Re: Как добраться к свойствам рисунка на странице в WebBrowser

Сообщение izogif » 29.04.2010 (Чт) 17:27

Тоже интересует решение описанной проблемы. Если не трудно, поделитесь идеями и/или кодом, пожалуйста.

euroflock
Обычный пользователь
Обычный пользователь
 
Сообщения: 68
Зарегистрирован: 26.02.2009 (Чт) 12:54

Re: Как добраться к свойствам рисунка на странице в WebBrowser

Сообщение euroflock » 29.04.2010 (Чт) 17:30

izogif писал(а):Тоже интересует решение описанной проблемы. Если не трудно, поделитесь идеями и/или кодом, пожалуйста.

Смотрите тут: viewtopic.php?f=2&t=39493


Вернуться в Visual Basic .NET

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 34

    TopList