Autor Beitrag
Scofield2011
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 55

Windows XP, Windows 7, Windows 8
C#, VBA, VB
BeitragVerfasst: Fr 19.10.12 21:15 
Hallo,

eigentlich habe ich sogar zwei Fragen. Die eine bezieht sich auf den folgenden Code:
ausblenden C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
        public static Bitmap MakeScreenShot()
        {
            Bitmap bmp = new Bitmap(814762);
            Graphics graf = Graphics.FromImage(bmp);
            graf.CopyFromScreen(Global.PositionSubForm.X + 4, Global.PositionSubForm.Y + 3000, bmp.Size);
            graf.Dispose();
            return bmp;
        }


Und zwar habe ich zwei Forms eines (MainForm) wird gleich beim Starten der Anwendung angezeigt, das andere (SubForm) wird erst über einen Button auf MainForm sichtbar bzw. es wird erst dann eine Instanz mit Referenz auf MainForm erzeugt.

Obiger Code befindet sich in einer public class und er wird auch beim Drücken eines Buttons auf dem SubForm ausgeführt, aber anstatt einen Screenshot von einem Teil des SubForms zu machen, wird der Screenshot zwar an den richtigen Koordinaten gemacht, aber anstatt des Ausschnittes vom SubForm ist immer nur ein Teil vom Windows Desktop zu sehen.

Das verrückte daran ist, dass oben stehender Code (ohne neu kompiliert zu sein) auf einen PC mit Windows 7 wie von mir vorgesehen funktioniert, während er auf einem Windows XP Rechner oben beschriebenes Verhalten zeigt.

Vielen Dank schon einmal im Voraus.

Scofield2011

P.S. Die Position vom SubForm wird übrigens immer per LocationChanged ermittelt und aktualisiert.
Christian S.
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 20451
Erhaltene Danke: 2264

Win 10
C# (VS 2019)
BeitragVerfasst: Fr 19.10.12 22:08 
Hallo!

Zum einen habe ich mal die zweite Frage entfernt, da bei uns gilt, dass nur eine Frage pro Topic gestellt werden soll. Das hat den Sinn, dass Du die zweite Frage mit einem korrekten Titel versehen kannst (und sie damit für andere einfacher aufzufinden ist) und zum anderen klar, ist, worüber gerade geredet wird.


Nun zu deiner ersten Frage: Die Form-Klasse hat die DrawToBitmap-Funktion, die solltest Du verwenden können, ohne mit Screenshots arbeiten zu müssen.

Grüße,
Christian

P.S.: Wieso wird die Position der SubForm nicht über ihre Left- und Top-Eigenschaften bestimmt?

_________________
Zwei Worte werden Dir im Leben viele Türen öffnen - "ziehen" und "drücken".
Scofield2011 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 55

Windows XP, Windows 7, Windows 8
C#, VBA, VB
BeitragVerfasst: Sa 20.10.12 00:31 
user profile iconChristian S. hat folgendes geschrieben Zum zitierten Posting springen:


Nun zu deiner ersten Frage: Die Form-Klasse hat die DrawToBitmap-Funktion, die solltest Du verwenden können, ohne mit Screenshots arbeiten zu müssen.

Grüße,
Christian

P.S.: Wieso wird die Position der SubForm nicht über ihre Left- und Top-Eigenschaften bestimmt?


Ich habe es nur SubForm genannt, weil es von dem anderen Form aus erzeugt wird. Es sind aber zwei Forms die frei und unabhängig von einander am Bildschirm platziert werden können und sie sind auch nicht modal. Dehalb speichere ich nach einem LocationChanged immer die neue Position um so immer den gleichen Bereich in meinem SubForm mit der Screenshot Methode zu erwischen. Wie gesagt finde ich es ja besonders komisch, dass es unter Windows 7 geht, aber bei Windows XP nicht.

Und mit DrawToBitmap kann ich auch einen Teilscreenshot machen?

Gruß
Scofield2011
Christian S.
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 20451
Erhaltene Danke: 2264

Win 10
C# (VS 2019)
BeitragVerfasst: Sa 20.10.12 12:48 
Die SubForm speichert doch troztdem ihre Position in Left bzw. Top. Es ist nicht notwendig, das LocationChanged-Event zu benutzen.

Zu XP vs. Win7: Kann ich jetzt auch nichts zu sagen, da müsste man wohl mal auf beiden Rechnern debuggen und gucken, ab wo das auseinander läuft. :nixweiss:

Und DrawToBitmap speichert ausschließlich die Form, über die es aufgerufen wird, im Bitmap. Das kann man noch weiter beschneiden, falls es nötig sein sollte.

_________________
Zwei Worte werden Dir im Leben viele Türen öffnen - "ziehen" und "drücken".
Scofield2011 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 55

Windows XP, Windows 7, Windows 8
C#, VBA, VB
BeitragVerfasst: Do 25.10.12 20:10 
Ich habe es jetzt mit DrawToBitmap versucht, der liefert mir auch einen Screenshot vom Control oder der Form, je nachdem was ich ihm übergebe, aber beides ist nicht ohne weiteres für den gewünschten Zweck einsetzbar.

Ein Screenshot nur vom Control (bei mir eine PictureBox) ist ungeeignet, weil dann darüberliegende Buttons und Labels nicht mit auf dem Screenshot drauf sind. Und ein Screenshot vom ganzen Form zeigt halt auch Teile, die ich gar nicht haben will. Jetzt weiß ich auch wieder warum ich mich für die andere Methode entschieden hatte. Oder kann man irgendwie von dem Screenshot von der ganzen Form nachträglich noch etwas abschneiden?

ausblenden C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
         public static Image MakeScreenShot()
         {
            keybd_event(0x2c00, IntPtr.Zero);
            Application.DoEvents();
            
            Image img = Clipboard.GetImage();
            
            return img;
         }

            [System.Runtime.InteropServices.DllImport("user32.dll")]
            private static extern IntPtr keybd_event(int key, int dummy, int flags, IntPtr info);


Ich habe jetzt mal oben stehenden Code probiert, aber leider habe ich noch nicht herausgefunden wie man nur einen Teil-Screenshot macht. Vielleicht habt ihr eine Idee.