Laden...

Frage zu Screenshot

Erstellt von mosspower vor 16 Jahren Letzter Beitrag vor 16 Jahren 2.914 Views
mosspower Themenstarter:in
456 Beiträge seit 2007
vor 16 Jahren
Frage zu Screenshot

Hallo Kollegen,

ich erstelle gerade eine Anwendung, die sich viele Informationen (Quoten, Ergebnisse ect.) aus dem Internet beschafft. Hier können zu Spitzenzeiten 70-100 InternetExplorer-Objekte instanziert sein und laufen. Natürlich werden alle Fehler, also es kann nicht wie gewünscht navigiert werden, festgehalten, hier die ganze HTML-Datei. Da es ja eine Zeit lang dauert, bis man das Fehlverhalten von allen Websites herausgefunden, bzw. das finden von Fehlern wesentlich schneller geht mit zusätzlichen Screenshots, dachte ich mir, dass ich eben immer bei einem Fehler zusätzlich, neben dem HTML-File, ein Screenshot erstelle. Dies funktioniert auch wunderbar. Nur habe ich hier ein Problem, bezüglich der Sichtbarkeit des Fensters. Wenn ich das InternetExplorer Objekt auf Visible = false stelle, soll später ein Windows-Service sein und den MSIE will ich nicht sehen, dann bekomme ich immer ein schwarzes Bild. Komisch ist, dass wenn ich alle Objekte auf meinem zweiten Bildschirm aufrufe (und diesen ausschalte), die Bilder trotzdem vorhanden sind (bei Visible = true). In ferner Zukunft (wenn das Programm fertig ist), werde ich natürlich die Anwendung auf einem Server laufen lassen, hier möchte ich eigentlich überhaupt keinen Bildschirm anschliesen (nur mit Remote-Desktop). Jetzt die Frage, muss ich auf die Images verzichten, wenn auf dem Server eine Exception fliegt, oder gibt es da eine Möglichkeit, denn im Bild sind ja auch nur irgendwelche binären Daten gespeichert. Gegenwärtig mache ich das, wie wahrscheinlich die meisten, mit User32.dll und GDI32.dll.

Freue mich über Eure Antworten.

49.485 Beiträge seit 2005
vor 16 Jahren

Hallo mosspower,

zwar keine Antwort, aber ein wichtiger Hinweis: Auch Datenbanken/-sammlungen stehen oftmals unter urheberrechtlichem Schutz und zwar auch dann, wenn sie frei abrufbar sind. Wenn du also viele Informationen (Quoten, Ergebnisse ect.) abrufen würdest, würdest du vermutlich gegen das Urheberrecht verstoßen und setzt dich entsprechend zumindest der Gefahr hoher Schadensersatzforderungen aus. Das hängt natürlich auch davon ab, wie du die Daten nutzt. Wenn du eine gewerbliche Nutzung vorhast, solltest du die Daten auf jeden Fall nur mit schriftlichem Einverständnis der Rechteinhaber abrufen.

herbivore

mosspower Themenstarter:in
456 Beiträge seit 2007
vor 16 Jahren

@herbivore,

ja, ich habe erst mal vor, die Daten nur für mich und mein privates! Programm zu nutzen. Sollte ich dennoch Daten öffentlich zur Verfügung stellen, dann habe ich vor, dass ich ausdrücklich auf die Herkunft verweise, natürlich nur nach vorheriger Genehmigung des "Lieferanten".

Gruß

P.S. Gibt es eigentlich Bestimmungen von, hm, wie soll ich das jetzt nennen, vielleicht "alltäglichen" Daten? Zum Beispiel stehen Aktienkurse doch jeden Tag in der Zeitung und auf jeder x-beliebigen Seite - das selbe gilt auch für Ergebnisse von Sportveranstaltungen (Fußball oder Tennis ect.) oder Buchmacherquoten (OK, hier ist es dann schon angebracht, die Genehmigung einzuholen, imo). Darf man die (anderen) so ohne weiteres weitergeben?

49.485 Beiträge seit 2005
vor 16 Jahren

Hallo mosspower,

Informationen als solche sind natürlich erstmal nicht urheberrechtlich geschützt. Der Schutz beschränkt sich auf Datensammlungen, und zwar um die Arbeit zu schützen, die es macht, solche Datensammlungen zu erstellen. Wo die Grenze zwischen Information und Datensammlung genau liegt, ist schwer zu sagen und muss im Zweifel von einem Gericht beurteilt werden. Die Gefahr liegt m.E. darin, dass die Daten normalerweise anbieterseitig schon vor dem Abruf Teil einer Datensammlung werden und auch wesentliche Teile von Datensammlungen sind geschützt. Genauere und vor allem verbindliche Auskünfte kann dir vermutlich nur ein Urheberrechtsanwalt geben. Ich wollte auf die grundsätzliche Problematik auch nur hinweisen.

herbivore

mosspower Themenstarter:in
456 Beiträge seit 2007
vor 16 Jahren

Um wieder auf die Ausgangsfrage zurückzukommen. Hat wirklich niemand eine Idee, wie man bei einem Fenster, das nicht sichtbar ist (oder minimiert) an die Pixelinformationen rankommt. Das muss doch technisch gesehen gehen, dass die Infos irgendswo hinterlegt sind und dann je nach Bedarf (sichtbar schalten, wieder aktivieren aus dem Minimiertmodus) die Daten an die Grafikkarte geschickt werden. Eigentlich müsste das ja auch gehen, ohne Grafikkarte, oder? Ich brauche doch eigentlich "nur" die Pixelinfos, das würde mir schon reichen. Wie geht ihr da vor, wenn ihr wisst, dass ein Problem technisch lösbar sei muss, ihr aber die Lösung nicht kennt? Gibt ja leider keine Bücher dazu. Ich habe schon viele Stunden im Netz damit verbracht. Leider immer nur die Lösung, dass Fenster sichtbar machen und dann Screenshot durchführen. Das sieht man aber im Fenster. Ich kann nicht "normal" surfen, z.B. Spiegel und dann macht der im Hintergrund immer diese Screenshots, das bekommt man nämlich mit. Noch schlimmer ist, dass mit dieser Lösung der Bildschrim immer an sein muss. Bitte erbarmt euch und helft mir, ggf. auch Tipps, wie ich zur Lösung kommen kann. Danke schon mal im voraus. 👍

R
494 Beiträge seit 2006
vor 16 Jahren

Nunja, sinnigerweise sollte das Betriebssystem nur zeichnen, was tatsächlich sichtbar ist.

2.760 Beiträge seit 2006
vor 16 Jahren

Wenn du doch sowieso weißt wo du auf deinen Webseiten die infos suchen musst, warum parst du dann nicht einfach die entsprechende Stelle im HTML-Code?

evtl. hilft dir das hier?❔Drucken eines Controls????
Drucken von Controls, die nicht komplett sichtbar sind?

[EDIT]
Schwachsinn! Mit nem anderen Thread verwechselt, 8o

mosspower Themenstarter:in
456 Beiträge seit 2007
vor 16 Jahren

Original von regen
Nunja, sinnigerweise sollte das Betriebssystem nur zeichnen, was tatsächlich sichtbar ist.

OK, das verstehe ich ja, vielleicht sollten wir uns an dem Namen Screenshot nicht "aufhängen". Mir persönlich reichen ja die Pixelinformationen, diese müssen doch immer an ein Ereignis, z.B. MaximizeWindow mitgeschickt werden, so dass letztendlich die Grafikkarte + Monitor das Fenster sichtbar macht - die Frage ist nur, wo stehen diese Bildinformationen. Ich kann mir nicht vorstellen, dass man das Window-Objekt direkt an den Renderer der Grafikkarte weitergibt 😉

Naja, der Threadtitel ist leider nun auch irreführend, weil sich das Problem scheinbar nicht mit einem Screenshot lösen lässt, was eigentlich verständlich ist.

2.760 Beiträge seit 2006
vor 16 Jahren

Ich kann mir nicht vorstellen, dass man das Window-Objekt direkt an den Renderer der Grafikkarte weitergibt

Nö, das sollte irgendwo in der GDI rumdümpeln, aber wahrscheinlich trotzdem nur das was auch sichtbar ist.

dass wenn ich alle Objekte auf meinem zweiten Bildschirm aufrufe (und diesen ausschalte) Was meintest du eigentlich damit?

mosspower Themenstarter:in
456 Beiträge seit 2007
vor 16 Jahren

OK, habe ich auch verstanden, aber wo sind dann die Infos hinterlegt, was sichtbar ist und was nicht, das müsste man doch manipulieren können, bzw. an die Pixelinformationen kommen.

49.485 Beiträge seit 2005
vor 16 Jahren

Hallo mosspower,

OK, habe ich auch verstanden, aber wo sind dann die Infos hinterlegt, was sichtbar ist und was nicht, das müsste man doch manipulieren können, bzw. an die Pixelinformationen kommen

gar nicht. Es wird nur gezeichnet, wenn es nötig ist. Und nur durch das Zeichnen, entsteht die Pixelinformation im Speicher der Grafikkarte und im Prinzip auch nur dort. Die Pixelinformation ist sonst nicht vorhanden. So läuft das unter Windows einfach nicht.

Also letztendlich steckt die Information, was gezeichnet werden soll nur im (C#-)Code von OnPaint und indirekt in den Datenstrukturen, auf die dieser Code zugreift. Aber eben nicht als Pixelinformation.

herbivore

2.760 Beiträge seit 2006
vor 16 Jahren

Das stelle ich mir schwierig vor, das sind nämlich interne Sachen des Betriebssystems welche dann warscheinlich auch in einem Speicherbereich liegen auf den du aus dotnet nicht zugreifen darfst.

Du könntest (wenn du eine Quelloffene findest) dir mal eine Implementierung für virtuelle Desktops anschauen und dann quasi für jede Instanz deines IE einen eigenen virtuellen Desktop in beliebiger Größe einrichten und den Screenshot von diesem machen. (Keine Ahnung ob das gehen könnte)

R
494 Beiträge seit 2006
vor 16 Jahren

Ich weiß nicht obs funktioniert, aber die Richtung, die onPaint Methode aufzurufen mit einem Graphics Objekt das du übergibst könnte vielleicht auch was sein.

2.760 Beiträge seit 2006
vor 16 Jahren

Keine Ahnung ob man die beim WebBrowser überhaupt beeinflussen kann (Ist doch nur der gewrappte IE)

Zu den virtuellen Desktops, sowas in die Richtung:
http://www.dexpot.de/

mosspower Themenstarter:in
456 Beiträge seit 2007
vor 16 Jahren

Original von jaensen
Keine Ahnung ob man die beim WebBrowser überhaupt beeinflussen kann (Ist doch nur der gewrappte IE)

Zu den virtuellen Desktops, sowas in die Richtung:

>

Das "Dingens" soll später als Windowsservice laufen, also arbeite ich nicht mit dem Webbrowser oder dem AXWebbrowser, sondern mit dem "Original", SHDocVw.InternetExplorer.

Original von jaensen
Was meintest du eigentlich damit?

Ich habe das mal getestet. Ich habe zwei Bildschrime angeschlossen an meinem Rechner, der Internet Explorer startet immer auf Bildschirm B (also da, wo man ihn das letzte mal gestartet hat). Schalte ich nun diesen Bildschirm (B) aus und lasse mein Programm laufen, dann bekomme ich die Screenshots wie gewünscht, obwohl nichts aufblitzt (hier habe ich Zeitverzögerung von 250 ms rein, da es sonst schwarz ist). Melde ich mich aber vorübergehend ab (Lock Computer Alt + Ctrl + Del), dann sind die Bilder schwarz, wenn ein paar Sekunden nach dem Locken mein Programm startet.

mosspower Themenstarter:in
456 Beiträge seit 2007
vor 16 Jahren

Original von herbivore... gar nicht. Es wird nur gezeichnet, wenn es nötig ist ...

Hm, das könnte schon mal bedeuten, dass sich mein Problem überhaupt nicht lösen lässt, denn das Betriebssystem wird es sicherlich nicht für nötig befinden, das Fenster zu zeichnen, wenn die Visible-Eigenschaft des Fensters auf false gesetzt ist. 🙁

2.760 Beiträge seit 2006
vor 16 Jahren
MSHTML IHTMLElementRender.DrawToDC()

Könnte das helfen?

Ich habe das mal getestet. Ich habe zwei Bildschrime angeschlossen an meinem Rechner, der Internet Explorer startet immer auf Bildschirm B (also da, wo man ihn das letzte mal gestartet hat). Schalte ich nun diesen Bildschirm (B) aus und lasse mein Programm laufen, dann bekomme ich die Screenshots wie gewünscht

Ausschalten? In den Anzeigeeigenschaften? Entweder bin ich zu blöd oder du hast es nicht richtig Formuliert, denn wenn du den Bildschirm Physkalisch ausschaltest ist das doch dem Grafikspeicher schnuppe.

mosspower Themenstarter:in
456 Beiträge seit 2007
vor 16 Jahren

Original von jaensen

MSHTML IHTMLElementRender.DrawToDC()  

Könnte das helfen?

Danke, da sehe ich mal nach, auf den ersten Blick ist das eher nur mit den gewrappten Controls (Webbrowser und AXWebbrower) möglich, und dann weiss ich auch nicht, ob das funktioniert, wenn die Eigenschaft visible auf false gesetzt ist .. ich werde das testen. Die Controls kann ich definitiv nicht verwenden.

Ausschalten? In den Anzeigeeigenschaften? Entweder bin ich zu blöd oder du hast es nicht richtig Formuliert, denn wenn du den Bildschirm Physkalisch ausschaltest ist das doch dem Grafikspeicher schnuppe.

Nö, Du hast mich schon richtig verstanden. Anscheinend ist es egal, wenn der Bildschirm physikalisch ausgeschalten wird, aber es ist nicht egal, wenn der Bildschirm läuft und man vorübergehend den Rechner sperrt - warscheinlich wird dann wieder hier davon ausgegangen, dass der Benutzer sowieso nix sehen kann, in diesem Modus, also zeichnen wir mal den Bildschirm nicht neu. (könnte mir vorstellen, dass so die Logik dahinter ist).

mosspower Themenstarter:in
456 Beiträge seit 2007
vor 16 Jahren

Original von jaensen
Oder den da?

>

OK, das wäre eine Lösung gewesen, das Problem ist nur, dass ich zu 95 Prozent Flash-Seiten haben werde und diese werden mit dem IHTMLRenderer nicht abgebildet - leider. Man, mich nervt das langsam, jetzt ist schon wieder so spät und finde keine Lösung - ich weiss bald nicht mehr, na was ich suchen muss. Nochmals zu dem Renderer. Wenn der es kann, dann MUSS! es auch eine Lösung für mein Problem geben, denn dieser rendert aus dem HTML-Code ein Image, ohne, dass der Browser sichtbar ist. OK, vielleicht habt ihr eine andere Idee, wie ich mein Problem lösen kann. Nochmal der Background. Es lauft eine Anwendung (Windowsservice, also nix GUI), diese ruft automatisiert Webseiten auf, hier brauche ich ein Image, um mittels OCR Texte aus den Images (Flash-Applikationen) lesen zu können (Tennis/Sport-Live-Ergebnisse). Das Navigieren passiert mit dem SHDocVw.InternetExplorer Objekt, die Eigenschaft visible ist auf false, d.h. alle Navigationen laufen im Hintergrund ohne sichtbar zu sein. Jetzt könnte ich immer kurz vor einem Screenshot, oder besser PrintWindow (User32.dll) mit dem MSIE sichtbar machen. Nur würden dann immer blitzende Fenster auftauchen. OK, damit könnte ich leben, ist ja dann Server und es wird sich da nur hin und wieder angemeldet, das blöde nur daran ist, dass hier auch noch ein Bildschirm immer an sein muss, bzw. es muss ein User angemeldet sein und darf nicht die Oberfläche gesperrt haben. Wie würdet ihr dieses Problem lösen?

Nachtrag, ich habe gerade ein Programm gefunden, welches genau das kann, was ich suche -> HTML TO IMAGE MIT FLASH ... das bedeutet doch, das es gehen MUSS, nur wie. Keine Ahnung wie die das machen, eine Instanz des Internetexplorers wird jedenfalls nicht verwendet.

Gleich noch eine Website mit API gefunden, für schlappe? 150 Bucks => API mit Flashunterstützung und zig Methoden .. naja, ich würde auch 500 Dollar bezahlen, nur wurmt es mich, dass ich es nicht weiss, wie es funzt. Der Internetexplorer muss drauf sein, d.h. die gehen über den. Nun ja, ein paar Tage noch suchen, dann werde ich mir das Ding kaufen (vielleicht erzählen die mir ja dann, wie es geht 🙂)

2.760 Beiträge seit 2006
vor 16 Jahren

Ich könnte mir vorstellen das es geht wenn du z.B. Gecko einbindest und dann halt nicht auf den Screen sondern in ein Image renderst.