Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 2011.06.12;
Скачать: [xml.tar.bz2];

Вниз

TWebBrowser + как узнать адрес ссылки   Найти похожие ветки 

 
Fr   (2011-02-28 21:52) [0]

В TWebBrowser загружена страничка с кучей ссылок. Необходимо по клику правой кнопкой мыши на произвольной ссылке узнать ее URL. Стандартное меню IE отключено и выводится свое.
как это можно сделать? Подскажите, пожалуйста, направление поиска решения проблемы.


 
KilkennyCat ©   (2011-02-28 22:29) [1]

property Document: IDispatch;


 
Противный   (2011-02-28 22:43) [2]

uses
 MSHTML;

{...}

var
 D2: IHTMLDocument2;
 LE: IHtmlAnchorElement;
begin
 if (WebBrowser1.Document <> nil) then
 begin
   D2 := WebBrowser1.Document as IHTMLDocument2;
   if (D2.activeElement <> nil) and (D2.activeElement.QueryInterface(IHtmlAnchorElement, LE) = S_OK) then
     Label1.Caption := LE.href;
 end;
end;


 
Fr   (2011-03-01 09:58) [3]

У меня уже мозг сейчас закипит :(
ElementFromPoint возвращает <BODY>, а не тег ссылки.
ActiveElement тоже связан с <BODY>, соответственно и QueryInterface(IHtmlAnchorElement, LE) не срабатывает.

Если пробегаться по элементам коллекции Document, то нормально выводит все тэги документа. Как же все-таки добраться до того, по которому кликнули мышью?


 
KilkennyCat ©   (2011-03-01 11:42) [4]

может, поможет:
показывает ссылку, на которую наведен курсор
http://delphi.about.com/od/vclusing/a/wbsinkevents.htm


 
Противный   (2011-03-01 12:15) [5]

>> ActiveElement тоже связан с <BODY>

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

var
 D2: IHTMLDocument2;
 LE: IHtmlAnchorElement;
begin
 if (WebBrowser1.Document <> nil) then
 begin
   D2 := WebBrowser1.Document as IHTMLDocument2;
   if (D2.activeElement <> nil) then
     if (D2.activeElement.QueryInterface(IHtmlAnchorElement, LE) = S_OK) then
       Label1.Caption := LE.href
     else
       Label1.Caption := "tagName: " + D2.activeElement.tagName;
 end;
end;


 
sniknik ©   (2011-03-01 12:39) [6]

> Как же все-таки добраться до того, по которому кликнули мышью?
для начала убрать
> Стандартное меню IE отключено и выводится свое.
видел как отключается обычно...
и судя по
> ElementFromPoint возвращает <BODY>
у тебя именно "тот" способ.


 
Fr   (2011-03-04 16:41) [7]

Для вывода своего меню используется:

unit uWBPopUp;

interface

implementation
uses Windows,Controls,Messages,ShDocVw,Forms;
var
 HMouseHook:THandle;
 Pop: Boolean;

function MouseProc(
                   nCode: Integer;     // hook code
                   WP: wParam; // message identifier
                   LP: lParam  // mouse coordinates
                   ): Integer; stdcall;
var MHS:TMOUSEHOOKSTRUCT;
   WC:TWinControl;
begin
 Result:=CallNextHookEx(HMouseHook,nCode,WP,LP);
 if nCode=HC_ACTION then begin
   MHS:=PMOUSEHOOKSTRUCT(LP)^;
   if ((WP=WM_RBUTTONDOWN) or (WP=WM_RBUTTONUP)) then begin
     WC:=FindVCLWindow(MHS.pt);
     if (WC is TWebBrowser) then begin
       Result:=1;
       if (TWebBrowser(WC).PopupMenu<>nil) and (WP=WM_RBUTTONUP) then begin
         if Pop then Exit;
         Pop := True;
         TWebBrowser(WC).PopupMenu.Popup(MHS.pt.x,MHS.pt.y);
         Pop := False;
        end;
     end;
   end;
 end;
end;

initialization
 HMouseHook:=SetWindowsHookEx(WH_MOUSE,@MouseProc,HInstance,GetCurrentThreadID);

finalization
 try
   UnhookWindowsHookEx(HMouseHook);
   Sleep(100);
   CloseHandle(HMouseHook);
 except
 end;

end.

Ничего более лучшего не нашел.
Так вот, если после
if (TWebBrowser(WC).PopupMenu<>nil) and (WP=WM_RBUTTONUP) then begin
пытаться обработать активный элемент, то возвращает <BODY>.
Как же правильно отключать браузерное меню и подменять его своим с доступом к тегам загруженной страницы? Из стандартного меню мне нужны только команды копипаста и несколько своих пунктов.


 
Противный   (2011-03-04 17:08) [8]

> Fr   (04.03.11 16:41) [7] Как же правильно отключать браузерное меню и подменять его своим с доступом к тегам загруженной страницы?

Во-первых, не использовать хуки.
Во-вторых, читать документацию: http://msdn.microsoft.com/en-us/library/aa770042%28v=vs.85%29.aspx#wbc_ctxmenus


 
sniknik ©   (2011-03-04 17:26) [9]

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

> Как же правильно отключать браузерное меню
http://delphimaster.net/view/6-1296642524/


 
Fr   (2011-03-04 17:56) [10]


> Противный   (04.03.11 17:08) [8]


> sniknik ©   (04.03.11 17:26) [9]

спасибо, буду изучать



Страницы: 1 вся ветка

Форум: "Начинающим";
Текущий архив: 2011.06.12;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.5 MB
Время: 0.003 c
2-1299053417
Гость
2011-03-02 11:10
2011.06.12
Как раскрасить title в DBGrid под Windows 7?


15-1298628283
Очень злой
2011-02-25 13:04
2011.06.12
вложенные With


2-1299749847
Неважно
2011-03-10 12:37
2011.06.12
C++ в Delphi.


3-1260193959
Бульбаш
2009-12-07 16:52
2011.06.12
Как правильно получить имя поля по дабл-клику на ячейке


2-1299310206
Alex_C
2011-03-05 10:30
2011.06.12
Согласованность получения данных





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский