Google Chrome Как Взять Url

  • Автор темы ITShef
  • Дата начала
Статус
Закрыто для дальнейших ответов.
I

ITShef

Гость
#1
Вдел в инете кучу примеров, но почему-то ни один из них не работает. Я не очень пока разбираюсь с дескрипторами окон (знаю только общий принцип) и посему возникли трудности. Прошу Вашей помощи с исходником, который просто перехватывал бы URL текущей вкладки CHROME. Только рабочий, плиз, те, что в инете лежат - подошел только один:
Код:
function GetText(WindowHandle: hwnd): string;
var
TxtLength: integer;
Buffer: string;
begin
TxtLength := SendMessage(WindowHandle, WM_GETTEXTLENGTH, 0, 0) + 1;
setlength(Buffer, TxtLength);
SendMessage(WindowHandle, wm_gettext, txtlength, longint(@Buffer[1]));
Result := Buffer;
end;

function GetChromeURL(hChrome: hwnd): string;
begin
Result := GetText(FindWindowEx(hChrome, 0, 'Chrome_AutocompleteEditView', nil));
end;
Но как мне определить хендл хрома для передачи его в качестве параметра - не знаю, FindWindow не помог, напишите, плиз рабочий вариант, а не просто название функций и т.п.
 

AndreyS

Active Member
15.10.2007
39
0
34
КИЕВ
#2
Делфи работает только с IE

Перехват URL в IE
===========

Код:
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.Button1Click(Sender: TObject);
begin
showmessage(Get_URL('IExplore'));
end;
===========

Может поможет
http://www.rsdn.ru/forum/delphi/4237274.flat.aspx
 
I

ITShef

Гость
#3
Спасибо конечно, но Chrome не поддерживает DDЕ, в этом вся проблема.
 

sinkopa

Well-Known Member
#4
Вдел в инете кучу примеров, но почему-то ни один из них не работает. Я не очень пока разбираюсь с дескрипторами окон (знаю только общий принцип) и посему возникли трудности. Прошу Вашей помощи с исходником, который просто перехватывал бы URL текущей вкладки CHROME. Только рабочий, плиз,
Вообще-то окошко Google Chrome, в котором находится URL имеет класс Chrome_OmniboxView.
К тому же, нужно учитывать что может быть запущено несколько окон браузера Chrome.
Поэтому придется перебрать все окна верхнего уровня, и у ВСЕХ кто имеет класс Chrome_WidgetWin_0 поискать дочернее окно с классом Chrome_OmniboxView.
Вот, как Вы просилиб рабочий пример:
Код:
unit Unit1;

interface

uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls;

type
TForm1 = class(TForm)
Button1: TButton;
Memo1: TMemo;
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;

var
Form1: TForm1;

implementation

{$R *.dfm}

function GetText(WindowHandle: hwnd): string;
var
TxtLength: integer;
Buf: string;
begin
TxtLength := SendMessage(WindowHandle, WM_GETTEXTLENGTH, 0, 0) + 1;
SetLength(Buf, TxtLength);
SendMessage(WindowHandle, WM_GETTEXT, TxtLength, LongInt(@Buf[1]));
Result := Buf;
end;

function EnumWndProc(WinHandle: HWND; Param: LongInt): Boolean; stdcall;
var
CapWnd: HWND;
CStr: array[0..114] of Char;
begin
Result := True;
if (GetParent(WinHandle) = 0) then
begin
GetClassName(WinHandle, CStr, 114);
if (StrPas(CStr) = 'Chrome_WidgetWin_0') then
begin
CapWnd := FindWindowEx(WinHandle, 0, 'Chrome_OmniboxView', nil);
if (CapWnd <> 0) then
TStrings(Pointer(Param)).Add(GetText(CapWnd));
end;
end;
end;

function GetChromeActiveURLS(outList:TStrings): Integer;
begin
Result := 0;
outList.Clear;
EnumWindows(@EnumWndProc, LParam(Pointer(outList)));
Result := outList.Count;
end;

procedure TForm1.Button1Click(Sender: TObject);
var
ChromeWinCount: Integer;
begin
ChromeWinCount := GetChromeActiveURLS(Memo1.Lines);
Memo1.Lines.Insert(0,Format('Нашлось %d активных окошек Google Chrome:',[ChromeWinCount]));
end;

end.
 
I

ITShef

Гость
#5
Примногоблагодарен! Вот люблю, когда есть конкретные вопросы и конкретные ответы и никакой демагогии!
Спасибо ОГРОМНОЕ!
 
Статус
Закрыто для дальнейших ответов.