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?
Nur mal so 'ins Blaue' geraten:
Versuchs mal mit einem
...Activate();
Application.DoEvents();
Bitmap sc1...
Gruß,
wcseller
Nein ändert leider auch nichts. Bisher auch keine Fortschritte meinerseits.
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
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
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.
Hier mal 2 Beispielbilder:
Das erste ist quasi das erste Vergleichsbild. Der etwas deformierte Ordner liegt normalerweise hinter dem Programm.
Und hier Nummer 2:
Ja wieso er hier richtig gezeichnet ist kann ich nicht beantworten.
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
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.
Wärst Du so nett und würdest Deine Lösung für die Nachwelt posten? 🙂
- performance is a feature -
Microsoft MVP - @Website - @AzureStuttgart - github.com/BenjaminAbt - Sustainable Code