Laden...

[erledigt] Screenshots von laufendem Programm

Erstellt von bl4ckY vor 12 Jahren Letzter Beitrag vor 12 Jahren 3.390 Views
B
bl4ckY Themenstarter:in
193 Beiträge seit 2009
vor 12 Jahren
[erledigt] Screenshots von laufendem Programm

Hallo,

habe ein kleines Problem. Ich will 2 Putty Sessions miteinander vergleichen. Nun mach ich mir von den 2 Sessionfenstern jeweils einen Screenshot und will dann die Bilder nach Unterschieden untersuchen. Problem ist das er mir keine ordentlichen Screenshots liefert.

Ich wechsel zwischen den beiden Sessions (die in Tabs laufen) hin und her und mache mir jeweils einen Screenshot. Problem ist das er mir Bilder von Ordnern zurückliefert vorrausgesetzt es befindet sich ein Ordner hinter dem Programm. Wird es direkt auf dem Desktop ausgeführt und alles andere ist minimiert bekomme ich exzellente Bilder. Leider versteh ich nicht wieso er solch ein Unfug macht.


//Fokus auf Tab setzen, Screenshot methode aufrufen
(comboBoxTabs1.SelectedItem as ctlPuttyPanel).Activate();
Bitmap sc1 = (comboBoxTabs1.SelectedItem as ctlPuttyPanel).GetScreenshot();
sc1.Save("a1.bmp");

//Position der Session ermitteln (Tab)
 public Bitmap GetScreenshot()
{
            Point p = Parent.PointToScreen(this.applicationwrapper.Location);
            Bitmap screenshot = screenCapture(this.applicationwrapper.Width, this.applicationwrapper.Height, p);
            return screenshot;
}

//Bild von übergebenen Bereich machen
private Bitmap screenCapture(int width, int height, Point location)
{
            Bitmap bmpScreenShot = new Bitmap(width, height);
            Graphics gfx = Graphics.FromImage((Image)bmpScreenShot);
            gfx.CopyFromScreen(location.X, location.Y, 0, 0, new Size(width, height));
            return bmpScreenShot;
}

Ich weiß nicht ob es daran liegt das er zu langsam zeichnet, kann es mir aber eigentlich nicht vorstellen. Mir ist gerade noch aufgefallen das er einige Pixel nicht richtig zeichnet. Buchstaben o.ä. wirken verschwommen oder fehlerhaft. Woran kann das liegen?

W
195 Beiträge seit 2008
vor 12 Jahren

Nur mal so 'ins Blaue' geraten:

Versuchs mal mit einem

...Activate();
Application.DoEvents();
Bitmap sc1...

Gruß,

wcseller

B
bl4ckY Themenstarter:in
193 Beiträge seit 2009
vor 12 Jahren

Nein ändert leider auch nichts. Bisher auch keine Fortschritte meinerseits.

795 Beiträge seit 2006
vor 12 Jahren

Hi, vllt hilft dir ja das hier weiter:

Control.DrawToBitmap

Gruß, Christian

`There are 10 types of people in the world: Those, who think they understand the binary system Those who don't even have heard about it And those who understand "Every base is base 10"`
B
bl4ckY Themenstarter:in
193 Beiträge seit 2009
vor 12 Jahren

Kannte ich noch garnicht. Funktioniert aber leider auch nicht da ich die Putty Session in einem eigenen Prozess laufen und das Control nur überlagern. Der Screenshot ist also nur grau.

edit: Zur Verständlichkeit etwas angepasst

49.485 Beiträge seit 2005
vor 12 Jahren

Hallo bl4ckY,

so wie ich mir das denke, laufen die Putty-Sessions doch jeweils als eigenständige Prozesse. Soweit ich das sehe hantierst du aber nur mit Controls aus deinem eigenen Prozess.

Wenn du sagst, dass du von den Putty-Fensters Screenhots machen kannst, wenn sie standalone laufen, sollte es mit dem gleichen Code auch dann gehen, wenn die Putty-Fenster in deinen Prozess eingebunden sind.

herbivore

B
bl4ckY Themenstarter:in
193 Beiträge seit 2009
vor 12 Jahren

Ja das funktioniert auch soweit mit kleinen Abstrichen. Wenn jedoch etwas hinter dem eigentlichen Programm ist (Ordner, anderes Programm) wird von diesem das Bild gemacht. Scheint so als würde sich der z-index ändern und das Programm komplett nach hinten rutschen obwohl es eigentlich vorne liegt. Leider schafft auch BringToFront() keine Abhilfe.

B
bl4ckY Themenstarter:in
193 Beiträge seit 2009
vor 12 Jahren

Hier mal 2 Beispielbilder:

Das erste ist quasi das erste Vergleichsbild. Der etwas deformierte Ordner liegt normalerweise hinter dem Programm.

B
bl4ckY Themenstarter:in
193 Beiträge seit 2009
vor 12 Jahren

Und hier Nummer 2:

Ja wieso er hier richtig gezeichnet ist kann ich nicht beantworten.

B
bl4ckY Themenstarter:in
193 Beiträge seit 2009
vor 12 Jahren

Nach langer Suche habe ich endlich herausgefunden woran es liegt. Allerdings stehe ich derzeit auf dem Schlauch und weiß nicht so recht wie ich es lösen kann.

Ich öffne ein Fenster in dem man die beiden zu vergleichenen Sessions auswählen kann. Damit dieses Fenster nicht auf dem Screenshot auftaucht verstecke ich es. Dabei scheint sich die komplette Form zu refreshen und versaut dabei meine Screenshots.

private void button1_Click(object sender, EventArgs e)
        {

           //Die Quelle des Fehlers!
            this.Hide();

            (comboBoxTabs1.SelectedItem as ctlPuttyPanel).Activate();
            Bitmap sc1 = (comboBoxTabs1.SelectedItem as ctlPuttyPanel).GetScreenshot();
            sc1.Save("a1.bmp", ImageFormat.Bmp);

            (comboBoxTabs2.SelectedItem as ctlPuttyPanel).Activate();
            Bitmap sc2 = (comboBoxTabs2.SelectedItem as ctlPuttyPanel).GetScreenshot();
            sc2.Save("a2.bmp", ImageFormat.Bmp);
            DialogResult = DialogResult.OK;
        }

Kann ich verhindern das sich die komplette Form neu lädt b.z.w wie löse ich das ganze am geschicktesten? Schließen, Dispose und alle anderen gängigen Vorgehensweisen sorgen für das gleiche Problem

795 Beiträge seit 2006
vor 12 Jahren

Was du auch machen könntest, ist es irgendwie das Handle des Putty-Fensters/Panels rauszubekommen und dann mittels nativer Calls das Fenster in einen DC der in eine Bitmap schreibt zu zeichnen.

Gruß, Christian.

`There are 10 types of people in the world: Those, who think they understand the binary system Those who don't even have heard about it And those who understand "Every base is base 10"`
B
bl4ckY Themenstarter:in
193 Beiträge seit 2009
vor 12 Jahren

erledigt.

16.807 Beiträge seit 2008
vor 12 Jahren

Wärst Du so nett und würdest Deine Lösung für die Nachwelt posten? 🙂