Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Win32/Win64 API (native code) (https://www.delphipraxis.net/17-win32-win64-api-native-code/)
-   -   Delphi URL aus Browser holen? (https://www.delphipraxis.net/172543-url-aus-browser-holen.html)

PeterPanino 9. Jan 2013 21:13

URL aus Browser holen?
 
Hallo! Ich habe jetzt sehr lange gesucht, aber nichts gefunden: Ich möchte die URL aus dem Browser holen. Das funktioniert per DDE mit Firefox und MSIE, aber nicht mit Opera und Chrome (offenbar kann Chrome kein DDE):
Delphi-Quellcode:
var
  BSourceFileNameNoExt: string;
  ClDDE: TDDEClientConv;
  zwi: PAnsiChar;

ClDDE := TDDEClientConv.Create(nil);
try
  with ClDDE do
  begin
    SetLink(BSourceFileNameNoExt, 'WWW_GetWindowInfo');
    zwi := RequestData('0xFFFFFFFF');
    CloseLink;
  end;
  Result := ExtractFirstQuotedString(StrPas(zwi));
finally
  StrDispose(zwi);
  ClDDE.Free;
end;
Wer weiß, wie man die URL aus jedem Browser holen kann, auch von Chrome und Opera?

CCRDude 10. Jan 2013 08:59

AW: URL aus Browser holen?
 
Ich hab das vor Ewigkeiten mal mit EnumWindows, EnumChildWindows and GetWindowText gemacht. Erfordert vorher ein wenig Arbeit mit WinSpy und ist nicht versionsänderungssicher. Finde den Code gerade leider auch nicht wieder. Seit Vista musst Du unter Umständen darauf achten, im Manifest entsprechende Angaben zu machen, um überhaupt so zugreifen zu können.

jaenicke 10. Jan 2013 09:09

AW: URL aus Browser holen?
 
Die Frage ist zusätzlich noch was denn "der Browser" ist. Ich habe z.B. typischerweise mehrere Tabs offen, wenn ich gerade etwas mache, da gibt es dann ja nicht die eine URL, sondern es sind mehrere offen.

PeterPanino 10. Jan 2013 12:15

AW: URL aus Browser holen?
 
Zitat:

Zitat von jaenicke (Beitrag 1198455)
Die Frage ist zusätzlich noch was denn "der Browser" ist. Ich habe z.B. typischerweise mehrere Tabs offen, wenn ich gerade etwas mache, da gibt es dann ja nicht die eine URL, sondern es sind mehrere offen.

Natürlich der aktuell geöffnete Tab.

PeterPanino 10. Jan 2013 12:32

AW: URL aus Browser holen?
 
Zitat:

Zitat von CCRDude (Beitrag 1198454)
Ich hab das vor Ewigkeiten mal mit EnumWindows, EnumChildWindows and GetWindowText gemacht. Erfordert vorher ein wenig Arbeit mit WinSpy und ist nicht versionsänderungssicher. Finde den Code gerade leider auch nicht wieder. Seit Vista musst Du unter Umständen darauf achten, im Manifest entsprechende Angaben zu machen, um überhaupt so zugreifen zu können.


Winspy sagt, die Klasse der URL-Box in Chrome ist "Chrome_OmniboxView", was eigentlich systemweit eindeutig sein und sich wohl auch nicht so schnell ändern dürfte. Bei meiner Aufgabenstellung ist der Chrome-Browser das TopMostWindow. Jetzt werd ich mal versuchen, über das Handle von GetForegroundWindow das ChildControl Chrome_OmniboxView ausfindig zu machen und von dem dann den Inhalt auszulesen.

PeterPanino 10. Jan 2013 14:55

AW: URL aus Browser holen?
 
Heureka! Hier ist die Funktion:
Delphi-Quellcode:
function GetChromeURL(const hwndChromeWindow: HWND): string;
var
  hwndChromeOmnibox: HWND;

  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;
begin
  Result := '';

  hwndChromeOmnibox := FindWindowEx(hwndChromeWindow, 0, PChar('Chrome_OmniboxView'), nil);
  if hwndChromeOmnibox <> 0 then
    Result := GetText(hwndChromeOmnibox);
end;

Man übergibt der Funktion das Handle des Chrome-Fensters und erhält als Ergebnis die in der URL-Zeile angezeigte URL.

PeterPanino 10. Jan 2013 15:45

AW: URL aus Browser holen?
 
Ich habe das jetzt auch mit Opera versucht, aber bei Opera kriege ich mit Winspy für alle Fensterelemente immer nur die Klasse "OperaWindowClass". Weiß jemand, wie man an die Opera URL-Box rankommen könnte? DDE funktioniert bei Opera auch nicht.

dunningkruger 10. Jan 2013 15:56

AW: URL aus Browser holen?
 
Siehe dein #1,

Delphi-Quellcode:
BSourceFileNameNoExt:='Opera';
Opera kann DDE :wink:

PeterPanino 10. Jan 2013 16:01

AW: URL aus Browser holen?
 
Zitat:

Zitat von dunningkruger (Beitrag 1198513)
Siehe dein #1,

Delphi-Quellcode:
BSourceFileNameNoExt:='Opera';
Opera kann DDE :wink:

Danke, habe es gerade rausgefunden und wollte es gerade posten!

Habe jetzt diese Browser abgedeckt: MSIE, Firefox, Chrome, Opera. Welche Browser sind noch relevant?

Klaus01 10. Jan 2013 16:02

AW: URL aus Browser holen?
 
vielleicht Safari?

Grüße
Klaus

dunningkruger 10. Jan 2013 16:22

AW: URL aus Browser holen?
 
QupZilla vielleicht (vermutlich Null Verbreitung), funktioniert fast so schön wie Opera, basiert aber auf WebKit (wie Chrome, Safari usw.), daher leider kein DDE ;-(

Zum Testen: http://portableapps.com/news/2013-01...1.3.5-released

An das Handle des Chrome-Fensters komme ich bisher nicht ran (habe allerdings nur Chrome portable).
Wie findest du das Handle von Chrome bzw. wonach suchst du in #6?

Danke!

PeterPanino 10. Jan 2013 16:50

AW: URL aus Browser holen?
 
Zitat:

Zitat von dunningkruger (Beitrag 1198517)
An das Handle des Chrome-Fensters komme ich bisher nicht ran (habe allerdings nur Chrome portable).
Wie findest du das Handle von Chrome bzw. wonach suchst du in #6?

Danke!


Ich verwende [Winapi.Windows.]GetForegroundWindow, weil bei meiner Aufgabenstellung Chrome den Fokus hat. Leider funktioniert
Delphi-Quellcode:
FindWindow('Chrome_WidgetWin_1', nil)
nicht, obwohl es laut WinSpy die Fensterklasse von Chrome ist. Würde mich auch interessieren, wenn jemand draufkommt.

PeterPanino 10. Jan 2013 18:35

AW: URL aus Browser holen?
 
Safari scheint eine harte Nuss zu sein. Ich habe bis jetzt keine Möglichkeit gefunden, an den Text der URL-Box in Safari ranzukommen. Die Klassen dort heißen SafariEdit, WebKitEdit oder WebViewWindowClass. Aber die werden von FindWindowEx offenbar nicht gefunden?

dunningkruger 10. Jan 2013 18:48

AW: URL aus Browser holen?
 
Zitat:

Zitat von PeterPanino (Beitrag 1198522)
Zitat:

Zitat von dunningkruger (Beitrag 1198517)
An das Handle des Chrome-Fensters komme ich bisher nicht ran (habe allerdings nur Chrome portable).
Wie findest du das Handle von Chrome bzw. wonach suchst du in #6?

Danke!


Ich verwende [Winapi.Windows.]GetForegroundWindow, weil bei meiner Aufgabenstellung Chrome den Fokus hat. Leider funktioniert
Delphi-Quellcode:
FindWindow('Chrome_WidgetWin_1', nil)
nicht, obwohl es laut WinSpy die Fensterklasse von Chrome ist. Würde mich auch interessieren, wenn jemand draufkommt.

Nicht nur Safari, sondern - soweit ich das bisher beurteilen kann - jeder webkit-Browser - zickt herum :(


Alle Zeitangaben in WEZ +1. Es ist jetzt 00: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