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)
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