![]() |
URLs aus Firefox-Instanzen auslesen
Hallo,
ich arbeite zur Zeit an einem Programm dass letztendlich einmal eine Art von persönlichem, zentralem "Internetcenter" darstellen soll, sprich mit eigenem Browser und maximaler Konfigurierbarkeit, erweiterten Möglichkeiten zur Verwaltung von Favoriten, Verlauf etc. Im Moment sitze ich gerade daran einen zentralen Verlauf zu programmieren der so funktionieren soll dass er mitliest welche URLs aufgerufen werden und diese nach Bedarf - je nach Einstellung - abspeichert, verschiebt oder auch erst konfiguriert und dann abspeichert. Für den IE habe ich zum Auslesen der URLs aller Instanzen folgende Methode benutzt:
Code:
Das Ganze funktioniert auch reibungslos, jedoch leider nur für den IE. Da aber ebenso der Firefox weitverbreitet ist möchte ich das selbe für diesen Browser implementieren, finde dazu jedoch keinen Ansatz. :(
uses shdocvw;
procedure TForm1.Button2Click(Sender: TObject); var x: Integer; Sw: IShellWindows; begin sw := CoShellWindows.Create; for x := 0 to SW.Count - 1 do Listbox1.Items.Add((Sw.Item(x) as IWebbrowser2).LocationUrl); end; Weiß jemand Rat ? |
Re: URLs aus Firefox-Instanzen auslesen
Hat denn niemand eine Idee :(
Ich habe zum Auslesen von URLs des Internet Explorer noch folgenden Quellcode gefunden:
Delphi-Quellcode:
Aufrufen kann man dann ganz einfach über
uses
ActiveX, Shdocvw_tlb, MSHTML_TLB; type TObjectFromLResult = function(LRESULT: lResult; const IID: TIID; WPARAM: wParam; out pObject): HRESULT; stdcall; function GetIEFromHWND(WHandle: HWND; var IE: IWebbrowser2): HRESULT; var hInst: HWND; lRes: Cardinal; MSG: Integer; pDoc: IHTMLDocument2; ObjectFromLresult: TObjectFromLresult; begin hInst := LoadLibrary('Oleacc.dll'); @ObjectFromLresult := GetProcAddress(hInst, 'ObjectFromLresult'); if @ObjectFromLresult <> nil then begin try MSG := RegisterWindowMessage('WM_HTML_GETOBJECT'); SendMessageTimeOut(WHandle, MSG, 0, 0, SMTO_ABORTIFHUNG, 1000, lRes); Result := ObjectFromLresult(lRes, IHTMLDocument2, 0, pDoc); if Result = S_OK then (pDoc.parentWindow as IServiceprovider).QueryService(IWebbrowserApp, IWebbrowser2, IE); finally FreeLibrary(hInst); end; end; end; procedure GetIEWindows(lb: TListBox); function EnumWindowsProc (Wnd: HWND; lb: TListBox): BOOL; stdcall; var theClassname: array [0..128] of Char; caption: Array [0..128] of Char; IE: IWebbrowser2; WndChild: HWND; begin Result := True; Windows.GetClassname( Wnd, theClassname, Sizeof( theclassname )); if theClassname='IEFrame' then begin WndChild := FindWindowEX(Wnd, 0, 'Shell DocObject View', nil); if WndChild <> 0 then begin WndChild := FindWindowEX(WndChild, 0, 'Internet Explorer_Server', nil); if WndChild <> 0 then begin if GetIEFromHWND(WndChild, IE)=S_OK then if IE<>nil then lb.Items.Add(IE.LocationURL); end; end; end; end; begin lb.Clear; EnumWindows(@EnumWindowsProc, integer(lb)); end;
Delphi-Quellcode:
Allerdings funktioniert das Ganze wieder nur für den IE :( Würde es vielleicht funktionieren wenn man das 'Internet Explorer_Server' durch den Namen des Firefox ersetzen würde ? 'Firefox' und 'Mozilla Firefox' haben jedenfalls nicht geklappt
procedure TForm1.Button1Click(Sender: TObject);
begin GetIEWindows(ListBox1); end; :( :( :( |
Re: URLs aus Firefox-Instanzen auslesen
Zitat:
Aber ich meine, wir hatten das schon mal mit dem Firefox. Benutzt mal die Forensuche. |
Re: URLs aus Firefox-Instanzen auslesen
Zitat:
ich habe die Forensuche mit "Firefox AND URL" gefüttert, allerdings in den Ergebnissen nicht wirklich etwas passendes gefunden. :( Bist du sicher dass es schon einmal etwas in der Richtung in diesem Forum gab ? |
Re: URLs aus Firefox-Instanzen auslesen
Hi,
Probiere mal diese Funktion:
Delphi-Quellcode:
procedure GetCurrentURL(out URL, Title: string);
var DDEClient : TDDEClientConv; p, q: PChar; i: Integer; begin DDEClient := TDDEClientConv.Create(nil); try with DDEClient do if SetLink('IExplore', 'WWW_GetWindowInfo') or SetLink('Netscape', 'WWW_GetWindowInfo') or SetLink('Mosaic', 'WWW_GetWindowInfo') or SetLink('Netscp6', 'WWW_GetWindowInfo') or SetLink('Mozilla', 'WWW_GetWindowInfo') or SetLink('Firefox', 'WWW_GetWindowInfo') then p := RequestData('0xFFFFFFFF') else raise Exception.Create('Could not establish browser DDE link'); if Assigned(p) then try q := p; Assert(q^ = '"'); SetLength(URL, StrLen(q)); Inc(q); i := 0; while q^ <> '"' do begin if (q^ = '\') and (q[1] = '"') then Inc(q); Inc(i); URL[i] := q^; Inc(q); end; SetLength(URL, i); SetLength(Title, StrLen(q)); i := 0; Inc(q, 3); while q^ <> '"' do begin if (q^ = '\') and (q[1] = '"') then Inc(q); Inc(i); Title[i] := q^; Inc(q); end; SetLength(Title, i); finally StrDispose(p); end else raise Exception.Create('Could not fetch browser data'); finally DDEClient.Free; end; end; |
Re: URLs aus Firefox-Instanzen auslesen
Hi,
super, die Procedure funktioniert :dp: Habe sie nur etwas umgeändert damit das Programm nicht beendet wird wenn kein Browser offen ist. Nun versuche ich gerade die Prozedur so umzustellen, dass alle Instanzen ausgelesen werden. Klappt aber noch nicht so wirklich :( |
Re: URLs aus Firefox-Instanzen auslesen
Welche Units muss man einbinden, damit es auch mit dem Kompilieren klappt. :roll:
|
Re: URLs aus Firefox-Instanzen auslesen
Zitat:
|
Re: URLs aus Firefox-Instanzen auslesen
Danke.
|
Re: URLs aus Firefox-Instanzen auslesen
Zitat:
|
Re: URLs aus Firefox-Instanzen auslesen
Zitat:
So schwierig kann es doch eigentlich nicht sein der von toms geposteten Prozedur ein paar Schnippsel Code hinzuzufügen, die dafür sorgen dass nach dem Auslesen der URL des ersten Browsers zum nächsten übergegangen werden soll :( |
Re: URLs aus Firefox-Instanzen auslesen
@toms
ich habe die proc nicht getestet aber ich hätte eine frage, weil ich das gleiche problem habe und zwar: geht das nur wenn ich meine eigne anwendung schreibe oder z.b. ich habe jetzt ein FireFox offen mit unterschiedlichen seiten und möchte gerne herrausfinden welchen link unter der Maus ist(statusbar)? |
Re: URLs aus Firefox-Instanzen auslesen
Kann mir jmd. Helfen, bei mir funktioniert das irgendwie nicht, es kommt immer "E2033 Die Typen der tatsächlichen und formalen Var-Parameter müssen übereinstimmen"???
|
Re: URLs aus Firefox-Instanzen auslesen
An welcher Stelle denn?
// EDIT: Bei mir funktioniert es mit Delphi 2007. :gruebel: |
Re: URLs aus Firefox-Instanzen auslesen
Wie rufst du den das auf?
|
Re: URLs aus Firefox-Instanzen auslesen
Delphi-Quellcode:
Wie sonst? :stupid:
var
MyUrl, MyTitle: String; begin GetCurrentURL(MyUrl, MyTitle); ShowMessage(MyUrl + #13#10 + MyTitle); |
Re: URLs aus Firefox-Instanzen auslesen
Okay, jetzt gehts zumindest soweit, aber jtezt kommt:
--------------------------- Project1 --------------------------- Assertion fehlgeschlagen (C:\***.pas, Zeile 45) --------------------------- OK --------------------------- Zeile 43-47:
Delphi-Quellcode:
if Assigned(p) then try
q := pchar(p); --> Assert(q^ = '"'); SetLength(URL, StrLen(q)); Inc(q); |
Re: URLs aus Firefox-Instanzen auslesen
Unter Delphi 2007 wie in deinem Profil steht? bei Delphi 2009 würde ich das eher vermuten, weil ein String dort ja ein UnicodeString und kein AnsiString mehr ist.
Bei mir funktioniert es jedenfalls mit Delphi 2007 problemlos. |
Re: URLs aus Firefox-Instanzen auslesen
Achso, nein ich habe D2009 und habe schon etwas mit PChar und PAnsiChar korrigiert....
Kannst du mir den Code wenn geht so schreiben dass er auch unter D 2009 funktioniert, währe echt cool! THX |
Re: URLs aus Firefox-Instanzen auslesen
Hast du auch String in AnsiString geändert? Denn sonst hast du weiter hinten vermutlich Probleme mit dem zeichenweisen Zugriff. Also so sollte es eigentlich gehen würde ich sagen:
Delphi-Quellcode:
procedure GetCurrentURL(out URL, Title: AnsiString);
var DDEClient : TDDEClientConv; p, q: PAnsiChar; i: Integer; begin ... var MyUrl, MyTitle: AnsiString; begin ... |
Re: URLs aus Firefox-Instanzen auslesen
Na toll, jetzt kommt wieder:
[DCC Fehler] E2033 Die Typen der tatsächlichen und formalen Var-Parameter müssen übereinstimmen Also, mein "kompletter" Code (Mal alles so wie du gemacht - Nur Test!)
Delphi-Quellcode:
unit Unit1;
interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, ddeman; type TForm1 = class(TForm) procedure FormCreate(Sender: TObject); private { Private-Deklarationen } public { Public-Deklarationen } end; var Form1: TForm1; implementation procedure GetCurrentURL(out URL, Title: AnsiString); var DDEClient : TDDEClientConv; p, q: PAnsiChar; i: Integer; begin DDEClient := TDDEClientConv.Create(nil); try with DDEClient do if SetLink('IExplore', 'WWW_GetWindowInfo') or SetLink('Netscape', 'WWW_GetWindowInfo') or SetLink('Mosaic', 'WWW_GetWindowInfo') or SetLink('Netscp6', 'WWW_GetWindowInfo') or SetLink('Mozilla', 'WWW_GetWindowInfo') or SetLink('Firefox', 'WWW_GetWindowInfo') then p := RequestData('0xFFFFFFFF') else raise Exception.Create('Could not establish browser DDE link'); if Assigned(p) then try q := p; Assert(q^ = '"'); SetLength(URL, StrLen(q)); Inc(q); i := 0; while q^ <> '"' do begin if (q^ = '\') and (q[1] = '"') then Inc(q); Inc(i); URL[i] := q^; Inc(q); end; SetLength(URL, i); SetLength(Title, StrLen(q)); i := 0; Inc(q, 3); while q^ <> '"' do begin if (q^ = '\') and (q[1] = '"') then Inc(q); Inc(i); Title[i] := q^; Inc(q); end; SetLength(Title, i); finally StrDispose(p); end else raise Exception.Create('Could not fetch browser data'); finally DDEClient.Free; end; end; {$R *.dfm} procedure TForm1.FormCreate(Sender: TObject); var url, title: String; begin HIER KOMMT DER FEHLER--> GetCurrentURL(url, title); ShowMessage(url + #13#10 + title); end; end. |
Re: URLs aus Firefox-Instanzen auslesen
Zitat:
Zitat:
Der Parameter der Prozedur ist nun einmal ein AnsiString jetzt, und als var-Parameter muss dieser Typ exakt übereinstimmen. |
Re: URLs aus Firefox-Instanzen auslesen
Was man alles übersehen kann =)
Danke @ jaenicke Also, richtig muss da natürlich sein: AnsiString! |
Alle Zeitangaben in WEZ +1. Es ist jetzt 16:53 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz