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 Markierten Text aus Webbrowser auslesen (https://www.delphipraxis.net/66289-markierten-text-aus-webbrowser-auslesen.html)

Yheeky 27. Mär 2006 23:31


Markierten Text aus Webbrowser auslesen
 
Hi,

ich würde gerne folgendes realisieren. Ich habe mein Programm am Laufen und würde diesem gerne Daten aus einem Browser zur Verfügung stellen. Das heikle an der Sache ist, dass diese Daten, die direkt aus dem Browser kommen, nicht manipuliert werden dürfen.

Beispiel:
Im Browser steht: Max Mustermann, Musterstraße 1, 12345 Musterstadt

Wenn man diese Daten nun mit Strg. + C. oder einfach über die Kopieren Funktion des Browsers in die Zwischenablage kopiert, lassen sich die Daten ja problemlos mit einem Texteditor verändern. Von dem Texteditor können die Daten ja nun wieder in die Zwischenablage kopiert werden und entsprechen damit nicht mehr den Originaldaten aus dem Browser.

Wie kann ich dieses Problem umgehen ohne den Quelltext der HTML Seite weiterzuverarbeiten?


Ich hoffe mir kann jemand helfen...

chaosben 28. Mär 2006 05:24

Re: Markierten Text aus Webbrowser auslesen
 
Naja, der Weg über die Zwischenablage ist, wie du schon richtig erkannt hast, manipulierbar.
Deshalb solltest du dir die Daten direkt holen. Der offizielle Weg führt imho über das Parsen des HTML's (besser gesagt: parsen lassen).
Alternativ könntest du den Browser fragen, was er denn gerade an selektiertem Text in petto hat. Es gibt hier im Forum einige Ansätze zum Thema "URL ändern beim Browser". Eventuell könntest du darüber an die Infos kommen.

marabu 28. Mär 2006 06:20

Re: Markierten Text aus Webbrowser auslesen
 
Hi Christian,

Zitat:

Zitat von Yheeky
Wie kann ich dieses Problem umgehen ohne den Quelltext der HTML Seite weiterzuverarbeiten?

diese Frage irritiert mich etwas, aber ohne die Zwischenablage kommst du so an den markierten Text:

Delphi-Quellcode:
uses
  MSHTML;

function SelectedText(doc: IHTMLDocument2): String;
begin
  with doc.selection.createRange as IHTMLTxtRange do
    Result := text;
end;

procedure TMainForm.CopyActionExecute(Sender: TObject);
begin
  ShowMessage(SelectedText(WebBrowser.Document as IHTMLDocument2));
end;
Grüße vom marabu

Edit: mehr Ordnung reingebracht...

chaosben 28. Mär 2006 06:43

Re: Markierten Text aus Webbrowser auslesen
 
@marabu: Die Antwort hätte ich ihm auch gern gegeben, aber folgendes hat mich stutzig gemacht:
Zitat:

Zitat von Yheeky
Ich habe mein Programm am Laufen und würde diesem gerne Daten aus einem Browser zur Verfügung stellen.

Mir scheint, die Daten kommen aus irgendeinem Browser. Oder irre ich mich, Christian?

marabu 28. Mär 2006 07:23

Re: Markierten Text aus Webbrowser auslesen
 
Hallo Benjamin,

Zitat:

Zitat von chaosben
Die Antwort hätte ich ihm auch gern gegeben

hättest du ruhig machen können - beim IE braucht Christian den Code so oder so. Ist das IE Fenster außerhalb der Anwendung, dann muss er sich den Zeiger auf die Schnittstelle IHTMLDocument2 anders besorgen: klick.

Für andere Browser-Fabrikate funktioniert der beschriebene Weg nicht.

Freundliche Grüße

marabu

chaosben 28. Mär 2006 08:45

Re: Markierten Text aus Webbrowser auslesen
 
Aha, wieder was gelernt. Danke :)

Yheeky 28. Mär 2006 12:30

Re: Markierten Text aus Webbrowser auslesen
 
Danke erstmal für die Antworten!

Es ist in der Tat so, dass ich den Code von allen verschiedenen Browser einbauen muss.
Ich habe nun aber schon Probleme bei dem oben stehenden Code. Ich habe auf meinem Desktop Delphi 5, auf meinem Laptop Delphi 2005 PE und an diesem sitze ich gerade. Hier wird mir gemeldet, dass er die Unit MSHTML nicht findet. Die Datei MSHTML.dcu gibt es auch nicht auf meinem Rechner. Ich finde sowieso, dass die ganze Installiererei mit Delphi 2005 PE viel komplizierter geworden ist. Kann mir da jemand einen Tipp geben, damit ich den Code mal so testen kann?

BTW: Ich habe auch den Link verfolgt und die Uses MSHTML_TLB, SHDocVw_TLB konnten ebenfalls nicht gefunden werden.

marabu 28. Mär 2006 12:53

Re: Markierten Text aus Webbrowser auslesen
 
Hallo Christian,

die Unit MSHTML.PAS kannst du dir selbst erstellen:

Code:
TLIBIMP -Fe- %windir%\system32\mshtml.tlb
Kopiere dir die erstellten Dateien in dein Source-Verzeichnis für Komponenten und installiere sie über ein neues Package.

marabu

Yheeky 28. Mär 2006 13:05

Re: Markierten Text aus Webbrowser auslesen
 
Zitat:

Zitat von marabu
Hallo Christian,

die Unit MSHTML.PAS kannst du dir selbst erstellen:

Code:
TLIBIMP -Fe- %windir%\system32\mshtml.tlb
Kopiere dir die erstellten Dateien in dein Source-Verzeichnis für Komponenten und installiere sie über ein neues Package.

marabu

Wie kann ich die denn erstellen? *g* TLIBIMP? Was ist das?

marabu 28. Mär 2006 13:14

Re: Markierten Text aus Webbrowser auslesen
 
Ich habe unterstellt, dass TLIBIMP im BIN Verzeichnis deiner Delphi-Installation liegt. Wenn nicht, dann hilft dir vielleicht dieser thread: klick

marabu

Yheeky 28. Mär 2006 13:34

Re: Markierten Text aus Webbrowser auslesen
 
Okay, mit der SHDocVw_TLB hat es geklappt aber die mshtml.tlb habe ich immer noch nicht reinbekommen. Die Datei TLIBIMP gibt´s auch nicht bei mir im BIN Verzeichnis. Wie kann ich die Datei denn sonst reinbekommen?

marabu 28. Mär 2006 15:55

Re: Markierten Text aus Webbrowser auslesen
 
Liste der Anhänge anzeigen (Anzahl: 2)
Das Utility TLIBIMP.EXE wird bei D5 in das BIN-Verzeichnis installiert. Eventuell hast du die Installation unterdrückt. Auf der Installations-CD sollte es drauf sein. Der Aufruf bei D5 ist auch etwas abweichend von D7:

Code:
tlibimp -A- %windir%\system32\mshtml.tlb
-A- unterdrückt das hässliche Suffix. Oder du schaust im Anhang.

marabu

Yheeky 28. Mär 2006 18:08

Re: Markierten Text aus Webbrowser auslesen
 
Okay, nun funktioniert das.
Das funktioniert aber nur, wenn ich einen IE Browser bei mir im Programm einbaue. Wie würde das mit externen Browsern funktionieren? Das interessiert mich eigentlich viel mehr...

marabu 28. Mär 2006 18:13

Re: Markierten Text aus Webbrowser auslesen
 
Hast du Beitrag #5 schon gelesen?

Yheeky 28. Mär 2006 18:28

Re: Markierten Text aus Webbrowser auslesen
 
Ja, aber bei dem Code kommt bei mir nur "Undefinierter Bezeichner: IShellWindows" :(

marabu 28. Mär 2006 19:33

Re: Markierten Text aus Webbrowser auslesen
 
Bei mir nicht. Streng dich bitte etwas mehr an - immerhin musst du bald meine Rente finanzieren.

Delphi-Quellcode:
uses
  MSHTML,
  ActiveX,
  ShlObj;

function SelectedText(doc: IHTMLDocument2): String;
begin
  with doc.selection.createRange as IHTMLTxtRange do
    Result := text;
end;

function InternetExplorer: IWebBrowser2;
var
  sw: IShellWindows;
  i: Integer;
  disp: IDispatch;
begin
  sw := CoShellWindows.Create;
  for i := 0 to Pred(sw.Count) do
  begin
    disp := sw.Item(i);
    if Succeeded(disp.QueryInterface(IID_IWebBrowser2, Result)) then
      Exit;
  end;
  Result := nil;
end;

procedure TDemoForm.ButtonClick(Sender: TObject);
var
  wb2: IWebBrowser2;
begin
  wb2 := InternetExplorer;
  if Assigned(wb2) then
    ShowMessage(SelectedText(wb2.Document as IHTMLDocument2));
end;
Freundliche Grüße vom marabu

Yheeky 28. Mär 2006 19:58

Re: Markierten Text aus Webbrowser auslesen
 
Liste der Anhänge anzeigen (Anzahl: 1)
Leider lässt mich Delphi nicht für deine Rente arbeiten... :roll:

DGL-luke 28. Mär 2006 20:06

Re: Markierten Text aus Webbrowser auslesen
 
Das Statement, das hier den aufkommenden Zweifel an deiner geistigen Verfassung zerstreuen würde, wäre "Ich habe die selben Sachen in den Uses wie marabu, es geht aber trotzdem nicht".

;)

marabu 28. Mär 2006 20:06

Re: Markierten Text aus Webbrowser auslesen
 
Drückeberger.

Dein Bild zeigt den falschen Ausschnitt aus dem Quelltext. Was hast du in der Uses-Klausel angegeben? IWebBrowser2 ist in ShDocVw deklariert.

marabu

@Lukas: eins rauf mit Mappe

Yheeky 28. Mär 2006 20:16

Re: Markierten Text aus Webbrowser auslesen
 
Ai, das musste auch noch dazu sagen. Ich habe gedacht, dass das alle sind, die du in die Uses reingeschrieben hast. ;) Danke trotzdem schonmal!

Nun geht das mit dem Internet Explorer, aber nicht, wenn ich den IE 2 mal auf habe. Dann wird nur der erste von beiden ausgelesen.
Kann man diesen Code nun noch auf andere Browser übertragen?

marabu 28. Mär 2006 20:32

Re: Markierten Text aus Webbrowser auslesen
 
Zitat:

Zitat von Yheeky
Ich habe gedacht, dass das alle sind, die du in die Uses reingeschrieben hast.

Habe ich zuerst auch gedacht - sorry.

Zitat:

Zitat von Yheeky
Nun geht das mit dem Internet Explorer, aber nicht, wenn ich den IE 2 mal auf habe. Dann wird nur der erste von beiden ausgelesen.

Den Code kann man anpassen, so dass er alle Fenster abklappert.

Zitat:

Zitat von Yheeky
Kann man diesen Code nun noch auf andere Browser übertragen?

Nein.

marabu

Yheeky 28. Mär 2006 20:37

Re: Markierten Text aus Webbrowser auslesen
 
Zitat:

Zitat von marabu
Den Code kann man anpassen, so dass er alle Fenster abklappert.

Ja? Wie denn? :)

Zitat:

Zitat von marabu
Zitat:

Zitat von Yheeky
Kann man diesen Code nun noch auf andere Browser übertragen?

Nein.

Brauch ich aber... :roll:

Yheeky 28. Mär 2006 22:57

Re: Markierten Text aus Webbrowser auslesen
 
Hi,

inzwischen bin ich auf folgenden Trichter gekommen:
Anmerkung: Ich möchte hiermit darauf hinweisen, dass der folgende Code NICHT vom mir stammt.

In einem Timer mit 10ms Interval wird geschaut, ob die Zwischenablage gefüllt ist und ob ein bestimmtes Fenster existiert. Wenn ja werden die Daten in das Memo übertragen. Hier der Code dafür:

Delphi-Quellcode:
procedure TForm1.Timer1Timer(Sender: TObject);
var a : array[0..1024] of char;
    h : HWND;
begin
clpbrd := TClipboard.create;

if clpbrd.FormatCount>0 then
begin
if clpbrd.GetTextBuf(a,1000)>0 then
begin
h:=FindWindow(nil,'Testbrowser - Mozilla Firefox');
if (h<>0) then Memo1.lines.Add(string(a));
clpbrd.clear;
end;

end;

end;
Das Problem ist nur, dass ja ein 2.Browser geöffnet sein kann und dann kann man auch aus diesem Daten ins Programm importieren.
Meine Frage nun: Wie kann ich die Funktion noch an ein bestimmtes Fenster anpassen (also dass nur noch aus der Zwischenablage gelesen wird, wenn es sich auch um den Testbrowser handelt aus dem kopiert wurde)?

Meine Idee hierfür ist: Wenn ich im Browser auf den Befehl kopieren gehe (egal ob der PopUp oder per Strg. + C.) muss der Fokus ja auf dem Browser liegen...vielleicht kann man das hierrüber irgendwie herausfinden?!

Wäre super, wenn mir da jemand helfen könnte!

toms 29. Mär 2006 08:17

Re: Markierten Text aus Webbrowser auslesen
 
Zitat:

In einem Timer mit 10ms Interval wird geschaut, ob die Zwischenablage gefüllt ist
Hallo,

Dad mit dem Timer gefaellt mir nicht. Vom System werden Ereignisse ausgeloest, wenn die Zwischenablage geaendert wird. Musst also nur auf jene Ereignisse reagieren.

cruiser 29. Mär 2006 11:17

Re: Markierten Text aus Webbrowser auslesen
 
eventuell auch nicht nur prüfen ob ein Fenster existiert, sondern auch ob es im Vordergrund ist

Greets


Alle Zeitangaben in WEZ +1. Es ist jetzt 03:07 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz