Zugrif auf Fenster eines anderen Programmes

Rund um die LCL und andere Komponenten
Antworten
br_klaus
Beiträge: 244
Registriert: Do 21. Jan 2010, 22:33
OS, Lazarus, FPC: Windows Vista (L 0.9.31 FPC 2.5.1)
CPU-Target: 32Bit
Wohnort: z.z. Brasilien, sonst 82335 Berg-Leoni (südlich von München)

Zugrif auf Fenster eines anderen Programmes

Beitrag von br_klaus »

Hallo,

gibt es eine Möglichkeit, von Lazarus aus auf andere Programme zuzugreifen bzw auf deren Fenster, die aber erst per Internet aktualisisert werden?

Konkret geht es mir darum, in einem Programm russischen Text in ein Fenster zu kopieren (zB Google Translate im Web), der dann vom Übersetzungs-Anbieter übersetzt wird und diesen dann in eine andere Datei kopieren. Da das Programm nur maximal 6000 Zeichen annimmt, muß ich meinen Text in Abschnitte unterteilen und die jeweils einzeln übersetzen lassen.

D.h. ich müßte von Lazarus aus für jeden Textabschnitt
1. den Text aus einer Datei auslesen (evtl. WORD),
2. in den Zwischenspeicher kopieren,
3. das Fenster auswählen,
4. Text dort hinein kopieren,
5. warten, bis der Text übersetzt ist (wie kann man erkennen, wann der Übersetzungsprozess zu Ende ist?),
6. Text auswählen und kopieren in den Zwischenspeicher,
7. Zieldatei öffnen,
8. dort Text anhängen.

Hat jemand konkrete Vorschläge, wie ich das anpacken könnte?
Herzlichen Dank
P. Nikolaus

Benutzeravatar
m.fuchs
Lazarusforum e. V.
Beiträge: 2822
Registriert: Fr 22. Sep 2006, 19:32
OS, Lazarus, FPC: Winux (Lazarus 2.0.10, FPC 3.2.0)
CPU-Target: x86, x64, arm
Wohnort: Berlin
Kontaktdaten:

Re: Zugrif auf Fenster eines anderen Programmes

Beitrag von m.fuchs »

Hallo,

bei dem konkreten Beispiel mit dem Google Translator wäre es sauberer, auf die von Google bereitgestellten Schnittstellen zuzugreifen: https://developers.google.com/translate/?hl=de
Damit sparst du dir den Aufwand irgendwelche Eingabecontrols in Webseiten zu finden.
Nachteil: Die Nutzung der Translator-API kostet Geld.
Vorteil: Wenn Google erkennt dass ein Programm die Übersetzungsanfragen über die Webseite schickt, sperren sie den Zugang oder sichern ihn per Captcha. Das macht deinen Lösungsvorschlag unbequemer.

Eine Alternative ist der Microsoft Translator (http://www.microsofttranslator.com/dev/). Dieser bietet wohl noch eine kostenfreie Nutzungsoption.
Software, Bibliotheken, Vorträge und mehr: https://www.ypa-software.de

mschnell
Beiträge: 3444
Registriert: Mo 11. Sep 2006, 10:24
OS, Lazarus, FPC: svn (Window32, Linux x64, Linux ARM (QNAP) (cross+nativ)
CPU-Target: X32 / X64 / ARMv5
Wohnort: Krefeld

Re: Zugrif auf Fenster eines anderen Programmes

Beitrag von mschnell »

br_klaus hat geschrieben:gibt es eine Möglichkeit, von Lazarus aus auf andere Programme zuzugreifen bzw auf deren Fenster, die aber erst per Internet aktualisisert werden?
Keine gute Idee. :?

Für Dein Vorhaben nimmst Du besser Synapse.

Das kann das HTTP - Protokoll und damit auf Webserver zugreifen.

Ich habe damit ein Programm gemacht, dass ein embedded Device über dessen Web-Interface fernsteuert.

Dabei muss ich ein User-login machen und auf diverse Webseiten jeweils unterschiedliche Daten aus irgendwelchen Browser-Wdgets auslesen und in solche eintragen und abschicken.

Die Fernsteuerung von Google-Translate ist da vermutlich viel einfacher.

Um herauszubekommen, wie die Kommunikation zwischen Browser und Server genau abläuft habe ich mir ein Developer Plugin in Firefox installiert, die das prima zeigt.

Nachteil: wenn Google auf die Idee kommt, die in unvorhersgesehener Weise Webseite zu verändern, läuft das Programm nicht mehr. (Die "Bastel-"Methode mit Auslesen des Bro2wser-Fensters aber auch nicht. )

-Michael

Michl
Beiträge: 2511
Registriert: Di 19. Jun 2012, 12:54

Re: Zugrif auf Fenster eines anderen Programmes

Beitrag von Michl »

mschnell hat geschrieben:Für Dein Vorhaben nimmst Du besser Synapse.
...wäre damit relativ einfach zu realisieren, wobei ich dabei eigentlich hauptsächlich rechtliche Bedenken hätte.
[SchlauReden:=open;] Wie bei den meisten kostenlosen Webdiensten, wird sicherlich der Google-Translator frei für die persönliche (per Browser) Nutzung sein, jedoch nicht für eine Verwendung in einem eigenem Programm (mal im Kleingedrucktem stöbern...Sie sind beispielsweise nicht berechtigt, in die Dienste einzugreifen oder in anderer Weise als über die von Google bereitgestellte Benutzeroberfläche und gemäß unseren Vorgaben auf die Dienste zuzugreifen... hmm, ist eher schwammig formuliert...). [SchlauReden:=close;]

Wenn es dir wirklich nur um die Übersetzung eines Textes geht, nicht um die Erstellung eines "eigenen" Übersetzers, könntest evtl. das Translator Toolkit von Google nutzen. Das ist, so wie es aussieht kostenlos https://support.google.com/translate/to ... opic=22235, 1MB je Upload, habe es selber aber nicht getestet.

Code: Alles auswählen

type
  TLiveSelection = (lsMoney, lsChilds, lsTime);
  TLive = Array[0..1] of TLiveSelection;  

mschnell
Beiträge: 3444
Registriert: Mo 11. Sep 2006, 10:24
OS, Lazarus, FPC: svn (Window32, Linux x64, Linux ARM (QNAP) (cross+nativ)
CPU-Target: X32 / X64 / ARMv5
Wohnort: Krefeld

Re: Zugrif auf Fenster eines anderen Programmes

Beitrag von mschnell »

Das rechtliche Problem würde sich aber genauso stellen, wenn man das Browser-Fenster per Software ausliest. Das ist nur technisch schlechter, aber juristisch genauso bedenklich.

Um einen einzigen Text zu übersetzen, kann man den irgendwo hochladen und Googles Webseiten-Übersetzter verwenden. ( http://translate.google.de/translate?hl ... 6p%3D64786 ) Da ein Browser einfachen Text als Web-Seite anzeigen kann, wird der Translator auch nicht auf html-Tags angewiesen sein.

Der Text landet dann natürlich in Googles Archiv und bei der NSA. Ob man das will, muss man natürlich selber wissen.

(Google und NSA haben bekanntermaßen überhaupt keine rechtlichen Bedenken bezüglich des Urheber- und Persönlichkeits-Schutzes.)

-Michael

br_klaus
Beiträge: 244
Registriert: Do 21. Jan 2010, 22:33
OS, Lazarus, FPC: Windows Vista (L 0.9.31 FPC 2.5.1)
CPU-Target: 32Bit
Wohnort: z.z. Brasilien, sonst 82335 Berg-Leoni (südlich von München)

Re: Zugrif auf Fenster eines anderen Programmes

Beitrag von br_klaus »

Mit Google Translator arbeite ich ungern. Da ist es äußerst schwierig, den übersetzten Text allein zu markieren. Das geht nur von Hand. Mit ^a wird fast die ganze Umgebung mit markiert, die ich dann erst wieder mühsam löschen müsste.
Aber ein recht praktisches Online-Programm ist zB Promt ( http://www.online-translator.com/Defaul ... fault.aspx ),
da genügt es, das jeweilige Fenster zu aktivieren (und den Button: Übersetzen), und mit ^a und ^v bzw ^c den Text zu markieren/copy/paste.

Ich habe mir jetzt ein Programm mit folgenden Prozeduren/Funktionen überlegt (P = procedure, F = function)

Code: Alles auswählen

 
 
var ein,aus, f,g:THandle; // Eingabe, Ausgabe-Fenster bzw Dateihandle der beiden Dateien
  buffer:PByte; buffersize:integer; // = 8000
  URLStream: TStream; FStream:TFileStream;
  Uebersetzung_OK:boolean;
 
P Puffer_Lesen(f:THandle; fpos:dword); // liest 6000 Bytes aus russischer OriginalDatei
F TextSuchen_in_Puffer(such:string; p:Pbyte; maxlg:integer):integer; // letztes Vorkommen von such <= maxlg-length(such), zum Suchen des letzten Absatzendes
 
P Puffer_zu_WebFenster(ein: THandle; p:Pbyte; plg:integer); // zu übersetzender Text
P WebFenster_zu_Stream(aus:Thandle; p:PByte; var lg:integer); // übersetzter Text --> in Puffer bzw gleich in FStream anhängen
 
P URL_Laden(URL:string); // --> in URLStream schreiben
P WebFenster_Aktivieren(t:THandle); // Jeweils ein oder aus aktivieren
P Warten_auf_Uebersetzung_OK
 
 
Die ersten beiden kann ich leicht programmieren. Bei den anderen bräuchte ich Hilfe. Leider habe ich hier kaum Zeit, Online am PC zu programmieren, der PC mit Internet ist in einem Gemeinschaftsraum und da kann ich nicht allzu lange davor sitzen. Programmieren tu ich auf einem anderen PC ohne Internetanbindung.
Ich könnte daher nur die Webseite (mit allem Drum und Dran) auf dem PC speichern (zB mit GetLeft) und dann Offline experimentieren.

Darum weiß ich auch nicht, wie Synapse gebraucht wird. Wahrscheinlich fürfte das nicht allzu schwierig sein. Aber vielleicht kann mir jemand Hilfestellung geben, wie ich die Prozeduren programmieren kann.
Herzlichen Dank
P. Nikolaus

br_klaus
Beiträge: 244
Registriert: Do 21. Jan 2010, 22:33
OS, Lazarus, FPC: Windows Vista (L 0.9.31 FPC 2.5.1)
CPU-Target: 32Bit
Wohnort: z.z. Brasilien, sonst 82335 Berg-Leoni (südlich von München)

Re: Zugrif auf Fenster eines anderen Programmes

Beitrag von br_klaus »

Habe jetzt eine Möglichkeit gefunden, die mir viel versprechender erscheint: Direkt auf die entsprechenden Fenster zugreifen mittels API-Funktionen. Habe lange gebraucht, bis ich da passende Tutorials gefunden habe. Ein ausgezeichnetes ist "...nach einem Feinster-Handle suchen?" in http://www.swissdelphicenter.ch/de/showcode.php?id=327.
Werde es jetzt damit versuchen.

mschnell
Beiträge: 3444
Registriert: Mo 11. Sep 2006, 10:24
OS, Lazarus, FPC: svn (Window32, Linux x64, Linux ARM (QNAP) (cross+nativ)
CPU-Target: X32 / X64 / ARMv5
Wohnort: Krefeld

Re: Zugrif auf Fenster eines anderen Programmes

Beitrag von mschnell »

br_klaus hat geschrieben:Darum weiß ich auch nicht, wie Synapse gebraucht wird.
Zu Synapse gibt es ganz ordentliche Hilfe auf deren Website.

Bei konkreten Fragen, bitte melden.

Das ist sicherlich einfacher, als über die Betriebssystem-API auf Fenster-Inhalte zuzugreifen.
Außerdem ist es unabhängig vom Betriebssystem, vom Browser, ...

Gruß,
-Michael

Antworten