Здравствуйте, BlackEric, Вы писали:
BE>А можно узнать какая вкладка активна в браузере? И как отследить переключение?
BE>Интересуют Opera, Firefox, Chrome и IE >7
Здравствуйте, BlackEric, Вы писали:
BE>А можно узнать какая вкладка активна в браузере? И как отследить переключение?
BE>Интересуют Opera, Firefox, Chrome и IE >7
Ну ты задачки себе задаёшь под вечер
Для каких целей тебе это надо? Шпиона пишешь?
В общем случае скорее всего решить твою задачу невозможно.
Здравствуйте, BlackEric, Вы писали:
BE>Здравствуйте, BlackEric, Вы писали:
BE>>А можно узнать какая вкладка активна в браузере? И как отследить переключение?
BE>>Интересуют Opera, Firefox, Chrome и IE >7
BE>Или открытый URL получить
Попробуй оттолкнутся вот от такого кода....
Uses DDEMan,....
function Get_URL(Servicio: string): String;
var
Cliente_DDE: TDDEClientConv;
temp:PChar;
begin
Result := '';
Cliente_DDE:= TDDEClientConv.Create( nil );
with Cliente_DDE do
begin
SetLink( Servicio,'WWW_GetWindowInfo');
temp := RequestData('0xFFFFFFFF');
Result := StrPas(temp);
StrDispose(temp);
CloseLink;
end;
Cliente_DDE.Free;
end;
procedure TForm1.Button2Click(Sender: TObject);
begin
showmessage(Get_URL('IExplore')); // для IEend;
Здравствуйте, Dimonka, Вы писали:
D>Здравствуйте, BlackEric, Вы писали:
BE>>А можно узнать какая вкладка активна в браузере? И как отследить переключение?
BE>>Интересуют Opera, Firefox, Chrome и IE >7
D>Ну ты задачки себе задаёшь под вечер D>Для каких целей тебе это надо? Шпиона пишешь?
D>В общем случае скорее всего решить твою задачу невозможно.
На самом деле все не так страшно, как кажется. Вот еще один вариант получения урлов.
Uses MSHTML, SHDocVw ....
procedure TForm1.Button3Click(Sender: TObject);
var
ShellWindow: IShellWindows;
WB: IWebbrowser2;
spDisp: IDispatch;
IDoc1: IHTMLDocument2;
k: Integer;
S:WideString;
begin
S:='';
ShellWindow := CoShellWindows.Create;
for k := 0 to ShellWindow.Count do
begin
spDisp := ShellWindow.Item(k);
if spDisp = nil then Continue;
spDisp.QueryInterface(iWebBrowser2, WB);
if WB <> nil then
begin
WB.Document.QueryInterface(IHTMLDocument2, iDoc1);
if iDoc1<>nil then S:=S+iDoc1.url;
end;
end;
ShowMessage(S);
end;
Здравствуйте, BlackEric.
Вы писали:
BE>А можно узнать какая вкладка активна в браузере? И как отследить переключение? BE>Интересуют Opera, Firefox, Chrome и IE >7
Для IE точно можно, но для этого нужно написать свое расширение к этому браузеру (кнопка,
тулбар или плагин типа BHO) — каждый экземпляр IE-расширения будет при инициализации
получать указатели на определенные структуры данных, через которые сможет взаимодействовать
с браузером.
Переключение вкладок, например, можно отследить через DWebBrowserEvents2::WindowStateChanged(),
подписавшись на эти события с помощью ConnectionPoints и указателей на базовые сервисы,
предоставляемые браузером.
Тема эта непростая — нужно хорошо разбираться в COM и архитектуре Internet Explorer-а.
Здравствуйте, okman, Вы писали:
O>Для IE точно можно, но для этого нужно написать свое расширение к этому браузеру (кнопка, O>тулбар или плагин типа BHO) — каждый экземпляр IE-расширения будет при инициализации O>получать указатели на определенные структуры данных, через которые сможет взаимодействовать O>с браузером.
Не обязательно.
O>Переключение вкладок, например, можно отследить через DWebBrowserEvents2::WindowStateChanged(), O>подписавшись на эти события с помощью ConnectionPoints и указателей на базовые сервисы, O>предоставляемые браузером. O>Тема эта непростая — нужно хорошо разбираться в COM и архитектуре Internet Explorer-а.
Еще как один из вариантов — искать адресную строку через проход по дочерним окнам IE (предварительно окно IE тоже нужно найти) и посылать этой строке WM_GETTEXT. Но сдается мне, что это несколько не то, что нужно
Здравствуйте, DarkMaster, Вы писали:
BE>>>А можно узнать какая вкладка активна в браузере? И как отследить переключение?
BE>>>Интересуют Opera, Firefox, Chrome и IE >7
D>>Ну ты задачки себе задаёшь под вечер D>>Для каких целей тебе это надо? Шпиона пишешь?
D>>В общем случае скорее всего решить твою задачу невозможно.
DM>На самом деле все не так страшно, как кажется. Вот еще один вариант получения урлов.
Осталось только добавить кода ещё для 3-х браузеров..
Здравствуйте, Dimonka, Вы писали:
D>Здравствуйте, BlackEric, Вы писали:
BE>>А можно узнать какая вкладка активна в браузере? И как отследить переключение?
BE>>Интересуют Opera, Firefox, Chrome и IE >7
D>Ну ты задачки себе задаёшь под вечер D>Для каких целей тебе это надо? Шпиона пишешь?
D>В общем случае скорее всего решить твою задачу невозможно.
Не не шпиона.
Нужна тулза которая будет орать в стиле: "А теперь закрываем lib.ru и работаем."
"BlackEric" <51397@users.rsdn.ru> wrote in message news:3849090@news.rsdn.ru... > Не не шпиона. > Нужна тулза которая будет орать в стиле: "А теперь закрываем lib.ru и работаем." > Всем спасибо за предложения, будем пробовать
Это делается не на клиенте, а нежелательные ресурсы просто банятся на прокси сервере.
Здравствуйте, wellwell, Вы писали:
W>"BlackEric" <51397@users.rsdn.ru> wrote in message news:3849090@news.rsdn.ru... >> Не не шпиона. >> Нужна тулза которая будет орать в стиле: "А теперь закрываем lib.ru и работаем." >> Всем спасибо за предложения, будем пробовать
W>Это делается не на клиенте, а нежелательные ресурсы просто банятся на прокси сервере.
В офисе — да.
Дома — нет.
Да и игрушки я дома не забаню.
Поскольку Google Chrome, в отличие от Firefox, Opera и IE не поддерживает DDE, то url из активных вкладок окон для него необходимо получать через WinAPI выдирая текст из окна.
Общая идея такова:
1. Находим все окна с классом Chrome_WidgetWin_0
2. Ищем для них дочернее окно с классом Chrome_AutocompleteEditView
3. Посылая ему WM_GETTEXT получаем Url
Для выяснения структуры окон Chrome, я использовал Spy++.
В коде:
function EnumMainWindowProc(Handle: HWnd; LParam: LParam): boolean; stdcall;
var
lpClassName: PChar;
intList: TList<HWND>;
begin
intList := TList<HWND>(LParam);
GetMem(lpClassName, 255);
try
FillChar(lpClassName^, 255, 0);
if (GetClassName(Handle, lpClassName, 255) > 0)and
(lpClassName = 'Chrome_WidgetWin_0') then
intList.Add(Handle);
finally
FreeMem(lpClassName);
end;
Result := true;
end;
procedure TForm1.GETURL_Chrome;
const
TEXT_LENGTH = 1024;
var
list: TList<HWND>;
handle, hWndChromeChild: HWND;
Buffer: string;
begin
list := TList<HWND>.Create;
try
if EnumWindows(@EnumMainWindowProc, LParam(list)) then
for handle in list do
Memo1.Lines.Add(IntToStr(handle));
Memo1.Lines.Add('');
Memo1.Lines.Add('Urls');
Memo1.Lines.Add('');
for handle in List do
begin
hWndChromeChild := FindWindowEx(Handle, 0,
PChar('Chrome_AutocompleteEditView'), nil);
if hWndChromeChild <> 0 then
begin
SetLength(Buffer, TEXT_LENGTH);
SendMessage(hWndChromeChild, WM_GETTEXT, TEXT_LENGTH, integer(@Buffer[1]));
Memo1.Lines.Add(Buffer);
end;
end;
finally
list.Destroy;
list := nil;
end;
end;