![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
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;