Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

TWebBrowser + как узнать адрес ссылки


Fr ©   (2011-02-28 21:52:00) 

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


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


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


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

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


sniknik   (2011-03-04 17:26:00) [2]

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

> Как же правильно отключать браузерное меню
http://www.delphimaster.ru/cgi-bin/forum.pl?id=1296642524&n=4


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

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

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


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

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

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>.
Как же правильно отключать браузерное меню и подменять его своим с доступом к тегам загруженной страницы? Из стандартного меню мне нужны только команды копипаста и несколько своих пунктов.


sniknik   (2011-03-01 12:39:00) [5]

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


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

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


KilkennyCat   (2011-03-01 11:42:00) [7]

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


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

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

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


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

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;


KilkennyCat   (2011-02-28 22:29:00) [10]

property Document: IDispatch;


Наверх

Титульная страница Поиск, карта сайта Написать письмо