Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2011.06.12;
Скачать: CL | DM;

Вниз

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;
Скачать: CL | DM;

Наверх




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


15-1298486107
Unknown_user
2011-02-23 21:35
2011.06.12
Аффинное преобразование


15-1298033535
oxffff
2011-02-18 15:52
2011.06.12
Языки и циклические зависимости между блоками компиляции(units)


15-1296229392
madmech
2011-01-28 18:43
2011.06.12
Перестала работать среда разработки


15-1298124342
KilkennyCat
2011-02-19 17:05
2011.06.12
Макетная плата от Texas Instruments