Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Netzwerke (https://www.delphipraxis.net/14-netzwerke/)
-   -   Delphi Screenshot über Sockets als JPEG versenden (https://www.delphipraxis.net/32928-screenshot-ueber-sockets-als-jpeg-versenden.html)

Neuni 29. Okt 2004 19:34


Screenshot über Sockets als JPEG versenden
 
Hallo zusammen.

Ich möchte gerne ein Remote-Tool programmieren. Auf dem Client soll ein Screenshot gemacht werden, der dann in JPEG komprimiert wird, und dann per Clientsocket an den Server gesendet wird.

Also den Screenshot mache ich mit:
Delphi-Quellcode:
function GetCursorInfo2: TCursorInfo;
var
 hWindow: HWND;
 pt: TPoint;
 pIconInfo: TIconInfo;
 dwThreadID, dwCurrentThreadID: DWORD;
begin
 Result.hCursor := 0;
 ZeroMemory(@Result, SizeOf(Result));
 // Find out which window owns the cursor
 if GetCursorPos(pt) then
 begin
   Result.ptScreenPos := pt;
   hWindow := WindowFromPoint(pt);
   if IsWindow(hWindow) then
   begin
     // Get the thread ID for the cursor owner.
     dwThreadID := GetWindowThreadProcessId(hWindow, nil);

     // Get the thread ID for the current thread
     dwCurrentThreadID := GetCurrentThreadId;

     // If the cursor owner is not us then we must attach to
     // the other thread in so that we can use GetCursor() to
     // return the correct hCursor
     if (dwCurrentThreadID <> dwThreadID) then
     begin
       if AttachThreadInput(dwCurrentThreadID, dwThreadID, True) then
       begin
         // Get the handle to the cursor
         Result.hCursor := GetCursor;
         AttachThreadInput(dwCurrentThreadID, dwThreadID, False);
       end;
     end
     else
     begin
       Result.hCursor := GetCursor;
     end;
   end;
 end;
end;

// 2. Capture the screen
function CaptureScreen: TBitmap;
var
 DC: HDC;
 ABitmap: TBitmap;
 MyCursor: TIcon;
 CursorInfo: TCursorInfo;
 IconInfo: TIconInfo;
begin
 // Capture the Desktop screen
 DC := GetDC(GetDesktopWindow);
 ABitmap := TBitmap.Create;
 try
   ABitmap.Width := GetDeviceCaps(DC, HORZRES);
   ABitmap.Height := GetDeviceCaps(DC, VERTRES);
   // BitBlt on our bitmap
   BitBlt(ABitmap.Canvas.Handle,
     0,
     0,
     ABitmap.Width,
     ABitmap.Height,
     DC,
     0,
     0,
     SRCCOPY);
   // Create temp. Icon
   MyCursor := TIcon.Create;
   try
     // Retrieve Cursor info
     CursorInfo := GetCursorInfo2;
     if CursorInfo.hCursor <> 0 then
     begin
       MyCursor.Handle := CursorInfo.hCursor;
       // Get Hotspot information
       GetIconInfo(CursorInfo.hCursor, IconInfo);
       // Draw the Cursor on our bitmap
       ABitmap.Canvas.Draw(CursorInfo.ptScreenPos.X - IconInfo.xHotspot,
                           CursorInfo.ptScreenPos.Y - IconInfo.yHotspot, MyCursor);
     end;
   finally
     // Clean up
     MyCursor.ReleaseHandle;
     MyCursor.Free;
   end;
 finally
   ReleaseDC(GetDesktopWindow, DC);
 end;
 Result := ABitmap;
end;
Is so lang, da man den Cursor ja sehen soll!

Nun kann ich das ganze ja in einem Image anzeigen lassen mit.
Delphi-Quellcode:
Image1.Picture.Assign(CaptureScreen);
Nun soll das ganze aber in JPEG konvertiert werden und das fertige Bild in einen Stream (soll ja per ClientSocket verschickt werden)



Hoffe ihr wisst, wie ich das anstelle :gruebel:

PS: Danke schonmal für die Antworten :-D

MasterC 29. Okt 2004 19:41

Re: Screenshot über Sockets als JPEG versenden
 
Hi,

benutze doch GraphicEx.

Edit: Merke gerade das GraphicEx kein JPG kann, aber es gibt ja noch andere gute Formate. PNG ist für Screenshots z.b. besser.

MFG Chris.

Neuni 29. Okt 2004 19:43

Re: Screenshot über Sockets als JPEG versenden
 
Wie mach ich das denn damit?

dizzy 29. Okt 2004 19:47

Re: Screenshot über Sockets als JPEG versenden
 
Wie wäre es mit der Unit "jpeg"?

MasterC 29. Okt 2004 19:47

Re: Screenshot über Sockets als JPEG versenden
 
GraphicEx musst du einfach nur einbiden und schon kannst du die Formate lesen. Ein TImage direkt in einen Stream speichern geht glaube ich nicht, du könntest es ja erst in eine Datei speichern und dann schicken.

Neuni 29. Okt 2004 19:49

Re: Screenshot über Sockets als JPEG versenden
 
Zitat:

Zitat von MasterC
GraphicEx musst du einfach nur einbiden und schon kannst du die Formate lesen. Ein TImage direkt in einen Stream speichern geht glaube ich nicht, du könntest es ja erst in eine Datei speichern und dann schicken.

Das mit der Datei wollte ich gerade verhindern, da es dadurch länger dauert. Wenn ich die dateien im RAM behalte geht es schneller (Es werden ja alle paar sekunden bilder übertragen)

flomei 29. Okt 2004 19:49

Re: Screenshot über Sockets als JPEG versenden
 
Und du könntest bitte Delphi-Tags verwenden. Danke!

MfG Florian :hi:

Neuni 29. Okt 2004 19:54

Re: Screenshot über Sockets als JPEG versenden
 
Welchen unterschied bitte macht es ob ich
Code:
CODE
oder
Delphi-Quellcode:
DELPHI
nehme?

MasterC 29. Okt 2004 20:00

Re: Screenshot über Sockets als JPEG versenden
 
Mit Delphi Tags hat der Code Delphi Language Highlighting.

Neuni 29. Okt 2004 20:05

Re: Screenshot über Sockets als JPEG versenden
 
OT: Ahh...ok, werd sie ab jetzt immer benutzen :stupid:

Aber jetzt back to topic :arrow:

Union 30. Okt 2004 01:58

Re: Screenshot über Sockets als JPEG versenden
 
Zitat:

Zitat von Neuni
Zitat:

Zitat von MasterC
GraphicEx musst du einfach nur einbiden und schon kannst du die Formate lesen. Ein TImage direkt in einen Stream speichern geht glaube ich nicht, du könntest es ja erst in eine Datei speichern und dann schicken.

Das mit der Datei wollte ich gerade verhindern, da es dadurch länger dauert. Wenn ich die dateien im RAM behalte geht es schneller (Es werden ja alle paar sekunden bilder übertragen)

Aber es müsste mit
Delphi-Quellcode:
TImage.Picture.Graphic.SaveToStream
gehen.

Neuni 30. Okt 2004 20:23

Re: Screenshot über Sockets als JPEG versenden
 
Mein Problem ist erstmal nur:

Wie bekomm ich das JPEG Bild in den stream und da auch erfolgreich wieder raus, sodas ich das dann auf dem Imahe auf dem anderen Computer sehe?

Beckman 30. Okt 2004 20:55

Re: Screenshot über Sockets als JPEG versenden
 
Liste der Anhänge anzeigen (Anzahl: 1)
hi neuni!

schau dir mal das projekt im anhang an.

und ins jpg konvertierst du bitmaps so:

uses jpeg;
Delphi-Quellcode:
procedure TForm1.Saveasjpg1Click(Sender: TObject);
var
   jpg: TJpegImage;
begin
//init
jpg := nil;

if savedialog1.Execute then begin
  try
    jpg := TJpegImage.Create;
    jpg.Assign(image1.Picture.Bitmap);
    //Hier können JPG-Eigenschaften wie Kompression, Größe usw. gesetzt werden
   
    jpg.SaveToFile(SaveDialog1.filename);
    finally
      jpg.Free;
      end;
  end;
end;

Neuni 30. Okt 2004 21:50

Re: Screenshot über Sockets als JPEG versenden
 
Danke, das is gut...aber ich wollte das ganze mit den sockets programmieren (Frag bitte nicht warum :-D )

Also die ausgabe vom "JPEG-Umwandler" könnte ich ja per
Delphi-Quellcode:
jpg.SaveToStream(stream);
in nen Stream packen, oder?

So, nun kann ich ja diesen Stream verschicken.
Delphi-Quellcode:
clientsocket1.Socket.SendStream(stream)
müsste gehen oder?

PS: Müsste der stream dann nen TStream sein, oder nen TFileStream?

Beckman 30. Okt 2004 22:21

Re: Screenshot über Sockets als JPEG versenden
 
das muesste doch aehnlich funken wie bei den indy sockets

und stream ist da das richtige.

Neuni 31. Okt 2004 12:28

Re: Screenshot über Sockets als JPEG versenden
 
Jetzt hab ich dat einfach so gemacht, aber dann kommt nen "ABstrakter Fehler":

Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
var
   jpg: TJpegImage;

begin

//init
jpg := nil;


  try
    jpg := TJpegImage.Create;
    jpg.Assign(image1.Picture.Bitmap);
    //Hier können JPG-Eigenschaften wie Kompression, Größe usw. gesetzt werden

    jpg.SaveToStream(stream);
    finally
      jpg.Free;
      end;
  end;
:wall: :wall: :wall:

Neuni 1. Nov 2004 09:45

Re: Screenshot über Sockets als JPEG versenden
 
Keiner ne idee? :cat:

alcaeus 1. Nov 2004 10:34

Re: Screenshot über Sockets als JPEG versenden
 
Hi Neuni,

wenn ich mich nicht irre dann musst du den Stream auch erzeugen. Außerdem würde es uns helfen zu wissen WO der abstrakte Fehler auftritt (beim Start, beim jpg.Assign, ...)

Greetz
alcaeus

fiasko 1. Nov 2004 10:37

Re: Screenshot über Sockets als JPEG versenden
 
Hallo,

abstrakter Fehler heißt du nimmst eine Methode eines Objektes für die keine Implementierung existiert. Ich vermute einfach mal dein "stream" ist ein TSream - das geht natürlich nicht da die ganze Klasse Abstract ist. Nimm doch einfach z.B. TMemoryStream oder wie das Ding hies!

Neuni 1. Nov 2004 11:16

Re: Screenshot über Sockets als JPEG versenden
 
Also erstellt hab ich den stream ja jetzt eigendlich mit Tmemorystream.create, und dat speichern in den stream geht nun auch, ohne dass er was sagt, aber wie bekomm ich das bild nun wieder aus dem stream raus?

Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
begin
stream := Tmemorystream.Create;

end;

procedure TForm1.Button2Click(Sender: TObject);
var
   jpg: TJpegImage;

begin

//init
jpg := nil;


  try
    jpg := TJpegImage.Create;
    jpg.Assign(image1.Picture.Bitmap);
    //Hier können JPG-Eigenschaften wie Kompression, Größe usw. gesetzt werden

    jpg.SaveToStream(stream);
    finally
      jpg.Free;
      end;
  end;
Wenn ich
Delphi-Quellcode:
stream.SaveToFile('C:\lolka.jpg');
nehme, dann kann ich dat bild speichern, das geht auch, aber wie bekomm ichs ins image ohne zwischenspeichern?

fiasko 1. Nov 2004 11:24

Re: Screenshot über Sockets als JPEG versenden
 
Wenn das jetzt im stream ist kannst du den doch mit dem Socket senden. Und auf der anderen Seite machst du das ganze rückwärts wieder mit einem TMemoryStream - also dort hinein empfangen und dann ein jpg.LoadFromStream(stream).

Neuni 1. Nov 2004 11:32

Re: Screenshot über Sockets als JPEG versenden
 
Jo, danke.

Aber jetzt sende ich den stream per
Delphi-Quellcode:
server.Socket.SendStream(stream)
is das richtig so? Weil beim server kommt nix an :-/

fiasko 1. Nov 2004 11:39

Re: Screenshot über Sockets als JPEG versenden
 
Zitat:

Zitat von Neuni
Aber jetzt sende ich den stream per
Delphi-Quellcode:
server.Socket.SendStream(stream)
is das richtig so? Weil beim server kommt nix an :-/

Na sicher nicht, sonst würde es ja gehen :mrgreen:

Du meinst auf dem Client kommt nix an? Wenn das server ein TServerSocket ist dann gibt es dort einen Array mit den einzelnen Verbindungssockets, das server.socket ist auf jedenfall falsch weil das nur der Listener Socket ist. Das heißt glaubig server.clientsockets oder irgendwie so... hab hier jetzt keine OH zu hand, mußte mal selber nachschauen :stupid:


Alle Zeitangaben in WEZ +1. Es ist jetzt 08:59 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz