Autor Beitrag
Hajoseb
ontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic starofftopic star
Beiträge: 42



BeitragVerfasst: Sa 09.06.07 21:50 
Hallo, an die Expertenrunde :-)

Ich nutze zur Zeit Delphi PE 2005 und würde gerne auf Turbo Delphi .net umsteigen.

ABER (das große) ...

Ich habe bisher noch keine Screenshot-Funktion finden können, die mit "echtem" .net arbeitet. Alle Lösungen, die ich bisher im I-net gefunden habe und auch nutze, benutzen "normale" Windows-aufrufe.

Ich schrecke also vor dem Schritt zurück, da ich nicht weis, ob meine Programme (Bis auf die Screencopy komplett in .net) dann noch nutzbar sind.

Gibt es irgendeine Lösung, einen Screencopy (für den gesammten Bildschirm, auch außerhalb meines Programm) in echtem .net zu realisieren und unter Turbo Delphi .net zu nutzen.

Vielen Dank im Vorraus.

P.S: Falls ich die Antwort auf diese Frage hier im Bord nur übersehen habe, bitte einen kutzen Tip auf den Thread. !!! Aber bitte nur, auf Lösungen, die auch mit .net funktionieren !!!


Moderiert von user profile iconChristian S.: Topic aus Multimedia / Grafik verschoben am Sa 09.06.2007 um 21:52
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 09.06.07 22:10 
Hallo!

Du willst wirklich mit Delphi .NET programmieren? :shock: Tu Dir einen Gefallen und benutze eine Sprache und IDE, die mindestens .NET 2.0 unterstützt. Das von Delphi unterstütze 1.1 ist seit Jahren veraltet ;-)

Hier eine Lösung, die zumindest unter 2.0 läuft. Müsste aber auch bei 1.1 gehen:
ausblenden Chrome Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
uses
  System.Drawing.Imaging;

{...}

  var thisScreen := Screen.PrimaryScreen; //Ich nehme den Primärbildschirm, kannst aber auch andere nehmen
    
  var screenBmp := new Bitmap(thisScreen.Bounds.Width, thisScreen.Bounds.Height, PixelFormat.Format32bppRgb); //Bitmap ausreichender Größe
  
  using grScreenBmp := Graphics.FromImage(screenBmp) do //Graphics-Objekt zum Bitmap
    grScreenBmp.CopyFromScreen(thisScreen.Bounds.X, thisScreen.Bounds.Y, 0,0, thisScreen.Bounds.Size, CopyPixelOperation.SourceCopy); //Bildschirmanzeige ins Bitmap kopieren
      
  pictureBox1.Image := screenBmp;  //in einer PictureBox anzeigen


Grüße
Christian

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



BeitragVerfasst: Sa 09.06.07 22:41 
Was, so einfach :-O ...

Das muss ich doch morgen gleich mal testen :-)

Alle Lösungen, die ich bisher gesehen habt (ohne .net) waren viel umständlicher...

mfg hajoseb

P.S. Ich bin froh, erst mal wieder in Delphi rein gekommen zu sein (hatte früher nur Turbo-Pascal) und das ich überhaupt .net durchblicke (Oberfläche *g*).

Wenn das so klappt, steige ich ersst mal auf Turbo-Delphi .net um und harre der Dinge die da kommen *g*
Hajoseb Threadstarter
ontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic starofftopic star
Beiträge: 42



BeitragVerfasst: Mo 11.06.07 10:00 
Hi.

Test war leider erfolglos.

Das Teil funktioniert nicht mit .net 1.1 :-(

-----
ausblenden Chrome Quelltext
1:
2:
3:
  using grScreenBmp := Graphics.FromImage(screenBmp) do //Graphics-Objekt zum Bitmap
  
    grScreenBmp.CopyFromScreen(thisScreen.Bounds.X, thisScreen.Bounds.Y, 0,0, thisScreen.Bounds.Size, CopyPixelOperation.SourceCopy); //Bildschirmanzeige ins Bitmap kopieren

using kennt Delphi 2005 PE nicht, was aber wichtiger ist:
CopyFromScreen gibt es im .net 1.1 nicht.

-----

Gibt es alternative Lösungen ???

Mfg Hajoseb

Moderiert von user profile iconChristian S.: Quote- durch Delphi-Tags ersetzt
Christian S.
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 20451
Erhaltene Danke: 2264

Win 10
C# (VS 2019)
BeitragVerfasst: Mo 11.06.07 10:13 
user profile iconHajoseb hat folgendes geschrieben:
ausblenden Chrome Quelltext
1:
2:
  using grScreenBmp := Graphics.FromImage(screenBmp) do //Graphics-Objekt zum Bitmap  
    grScreenBmp.CopyFromScreen(thisScreen.Bounds.X, thisScreen.Bounds.Y, 0,0, thisScreen.Bounds.Size, CopyPixelOperation.SourceCopy); //Bildschirmanzeige ins Bitmap kopieren

using kennt Delphi 2005 PE nicht, was aber wichtiger ist:
Ach so, stimmt, das heißt soviel wie:
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
grScreenBmp := Graphics.FromImage(screenBmp);
try
  grScreenBmp.CopyFromScreen(thisScreen.Bounds.X, thisScreen.Bounds.Y, 0,0, thisScreen.Bounds.Size, CopyPixelOperation.SourceCopy);
finally
  grScreenBmp.Dispose;
end;
Eigentlich legt Dir Chrome dann noch die Variable an und verpackt das ganze in einen with-Block, aber ob Delphi .NET das kann, weiß ich nicht.


user profile iconHajoseb hat folgendes geschrieben:
CopyFromScreen gibt es im .net 1.1 nicht.

-----

Gibt es alternative Lösungen ???
.NET 2.0 benutzen :D Nee, im Ernst, was anderes fällt mir da leider nicht ein. .NET 1.1 war einfach noch in vielen Punkten unfertig und umständlich.

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



BeitragVerfasst: Mo 11.06.07 10:32 
Danke erst mal.

Falls es keine Lösung gibt ... kennt jemand eine Hypnoschulung für c# :D

;-) Hajoseb (der die Hoffnung noch nicht aufgegeben hat)
JüTho
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 2021
Erhaltene Danke: 6

Win XP Prof
C# 2.0 (#D für NET 2.0, dazu Firebird); früher Delphi 5 und Delphi 2005 Pro
BeitragVerfasst: Mo 11.06.07 10:45 
Hallo Hajoseb,

mit einer fertigen Lösung kann ich nicht dienen. Mein Verfahren Formular/Control drucken oder als Bitmap speichern befasst sich mit Controls (und abgeleiteten Klassen), nicht mit dem gesamten Screen.

Ich musste mich dabei ebenfalls mit den Unterschieden zwischen NET 1.1 und 2.0 befassen. Für 1.1 habe ich die folgende Routine benutzt; sie kann vermutlich für den Screen nachgearbeitet werden (ich habe das aber nicht erledigt, sondern nur kurz in den Stichpunkten in der Doku geprüft):
ausblenden volle Höhe C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:
44:
45:
46:
47:
//  NET 1.1 - copy the control's graphics using Windows GDI
[DllImport("gdi32.dll")]
private static extern long BitBlt(
      IntPtr hdcDest,
      int xDest,
      int yDest,
      int nWidth,
      int nHeight,
      IntPtr hdcSource,
      int xSrc,
      int ySrc,
      Int32 dwRop);

const int SRCCOPY=13369376;

private Bitmap GetBitmap(Control Ctrl) {

  //  create the source graphics and the required bitmap
  Graphics grCtrl = Graphics.FromHwnd(Ctrl.Handle);
  Bitmap Result = new Bitmap(Ctrl.Width, Ctrl.Height, grCtrl);

  //  we need handles to copy graphics
  IntPtr   hdcCtrl = grCtrl.GetHdc();
  Graphics grDest  = Graphics.FromImage(Result);
  IntPtr   hdcDest = grDest.GetHdc();

  //  copy the image from source hdcCtrl to destination hdcDest
  //  using BitBlt (bit block transfer) of Windows GDI
  //  note:  a form is normally printed without title or menu bar;
  //        therefore, one has to move the graphics
  int SourceX, SourceY;
  if (Ctrl is Form) {
    SourceX = Ctrl.ClientSize.Width  - Ctrl.Width  + 4;
    SourceY = Ctrl.ClientSize.Height - Ctrl.Height + 4;
  } else {
    SourceX = 0;
    SourceY = 0;
  }
  BitBlt(hdcDest, 00, Ctrl.Width, Ctrl.Height, hdcCtrl, SourceX, SourceY, SRCCOPY);

  //  free the used objects
  grCtrl.ReleaseHdc(hdcCtrl);
  grDest.ReleaseHdc(hdcDest);

  //  that's all work for the bmp using NET 1.1 instructions
  return Result;
}

Zu beachten ist außerdem, dass BitBlt() ziemlich langsam ist.

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

Win 10
C# (VS 2019)
BeitragVerfasst: Mo 11.06.07 10:53 
user profile iconHajoseb hat folgendes geschrieben:
DFalls es keine Lösung gibt ... kennt jemand eine Hypnoschulung für c# :D
Nicht unbedingt Hypno aber sehr zu empfehlen: www.galileocomputing...ual_csharp/index.htm

@JüTho: Das benutzt ja aber auch wieder PInvoke und wenn ich das richtig verstanden habe, war eine Lösung ohne das gesucht.

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



BeitragVerfasst: Mo 11.06.07 11:31 
@ JüTho

Ich schau es mir mal an.
Die Grundfrage: Läuft das dann auch uter Turbo Delphi .net ???

Das ist meine bisherige Lösung. Kann man die mal unter Turbo Delphi .net testen?

Mfg Hajoseb

ausblenden volle Höhe Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
unit uScreencopy;

interface

uses
  System.Drawing,
  System.Windows.Forms,
  System.Drawing.Imaging;

function CopyScreen : Image;

implementation

uses windows;

var g2      : Graphics;
    img     : Image;

function CopyScreen : Image;
var dc1     : HDC;
    dc2     : IntPtr;

begin
  // Kopieren der Fenster-Bitmap in die eigene Bitmap:
  dc1 := GetDC(0);
  dc2 := g2.GetHdc();

  BitBlt(HDC(dc2), 00, Screen.PrimaryScreen.WorkingArea.Width, Screen.PrimaryScreen.WorkingArea.Height, dc1, 0013369376);
  ReleaseDC(0,dc1);
  g2.ReleaseHdc(dc2);

  Result := img;
end;

  //  Erzeugen einer neuen Bitmap mit den Maßen und der Farbtiefe des aktuellen Fensters:
begin
  img := system.Drawing.Bitmap.Create(Screen.PrimaryScreen.WorkingArea.Width, Screen.PrimaryScreen.WorkingArea.Height);
  g2  := Graphics.FromImage(img);
end.
JüTho
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 2021
Erhaltene Danke: 6

Win XP Prof
C# 2.0 (#D für NET 2.0, dazu Firebird); früher Delphi 5 und Delphi 2005 Pro
BeitragVerfasst: Mo 11.06.07 12:26 
@Hajoseb,
das musst Du schon selbst ausprobieren. Auf den ersten Blick hat es große Ähnlichkeiten mit meinem Verfahren. Allerdings habe ich den Eindruck, dass begin-end und die einzelnen Schritte nicht richtig zusammenpassen; das kann aber auch am Kopieren liegen.

@Christian
Das mit dem Invoke ist mir bewusst. Aber Du hast ja schon vorher geschrieben, dass es unter NET 1.1 nicht anders geht; und nachdem es Hajoseb Dir nicht geglaubt hat, hat er es jetzt auch von Bernhard Geyer gelesen.

Jürgen
Hajoseb Threadstarter
ontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic starofftopic star
Beiträge: 42



BeitragVerfasst: Mo 11.06.07 14:22 
Hallo, Jütho.

Ich habe ihm schon geglaubt, aber eben die Hoffnung nicht vollends aufgegeben ;-)

Das mit den begin-end würde mich schon interessieren.

Mit dem
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
  //  Erzeugen einer neuen Bitmap mit den Maßen und der Farbtiefe des aktuellen Fensters: 
begin 
  img := system.Drawing.Bitmap.Create(Screen.PrimaryScreen.WorkingArea.Width, Screen.PrimaryScreen.WorkingArea.Height); 
  g2  := Graphics.FromImage(img); 
end.


habe ich in der Initialisierung des Modul, damit nicht bei jedem neuen Aufruf mit create eine neue Bitmap im speicher erzeugt wird, sondern nur einmal am Anfang. Sonst ist der Speicher doch gleich voll...

Und hier
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
function CopyScreen : Image; 
var dc1     : HDC; 
    dc2     : IntPtr; 

begin 
  // Kopieren der Fenster-Bitmap in die eigene Bitmap: 
  dc1 := GetDC(0); 
  dc2 := g2.GetHdc(); 

  BitBlt(HDC(dc2), 00, Screen.PrimaryScreen.WorkingArea.Width, Screen.PrimaryScreen.WorkingArea.Height, dc1, 0013369376); 
  ReleaseDC(0,dc1); 
  g2.ReleaseHdc(dc2); 

  Result := img; 
end;

wird dann "nur" kopiert.


... oder sehe ich da etwas falsch ???

Mfg Hajoseb

P.S. Und mit dem sleber probieren, beißt sich die Katze in den Schwanz ...

ich möchte Turbo Delphi .net ja erst installieren, wenn ich weis das es geht.
Robert_G
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 416


Delphi32 (D2005 PE); Chrome/C# (VS2003 E/A, VS2005)
BeitragVerfasst: Di 12.06.07 20:50 
user profile iconHajoseb hat folgendes geschrieben:
P.S. Und mit dem sleber probieren, beißt sich die Katze in den Schwanz ...
ich möchte Turbo Delphi .net ja erst installieren, wenn ich weis das es geht.
Sozusagen ein Wallach mit Plüschfell? :mrgreen:

btw: Das dürfte schwer werden, jemanden zu finden, der Turbo Delphi.Net drauf hat. Denn derjenige hätte dann kein Turbo Delphi32. ;)
Spar dir den Ärger und kiek dir C# Express an. Kostet nix und lässt Delphi.Net alt aussehen. Hauptsächlich die IDE Features, aber auch die Sprache selbst geht einen in .Net viel leichter von der Hand.
Hajoseb Threadstarter
ontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic starofftopic star
Beiträge: 42



BeitragVerfasst: Mi 13.06.07 12:35 
Ich lese mir gerade das C#-Buch durch und werde dann mal versuche, mein Programm auf c# zu convertieren :-)

Ansonsten erst mal Danke an alle !!!