Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Win32/Win64 API (native code) (https://www.delphipraxis.net/17-win32-win64-api-native-code/)
-   -   Delphi ScreenShot-Programm zu groß (https://www.delphipraxis.net/40545-screenshot-programm-zu-gross.html)

Cicaro 17. Feb 2005 13:11


ScreenShot-Programm zu groß
 
Tach!

Mit dem Code

Delphi-Quellcode:
var
 DC:HDC;
 B:TBitmap;

B:=TBitmap.Create;
B.Width:=Screen.Width;
B.Height:=Screen.Height;
DC:=GetWindowDC(GetDesktopWindow);
BitBlt(B.Canvas.Handle,0,0,B.Width,B.Height,DC,0,0,SrcCopy);
B.SaveToFile('D:\ScreenShot.bmp');
B.Free;
kann man ja einen ScreenShot machen. Das mach' ich in einem Programm, das kein Formular besitzt, da ich es einfach und schnell haben wollte.

Allerdings muss man, um die globale Variable Screen abfragen zu können, die Unit Forms usen und, um HDC zu verwenden, die Unit Windows.

Durch die Nutzung dieser Units ist meine EXE mindestens 360 KB groß.
Ist auf irgeneinem Wege möglich das Programm klein zu halten ?

Danke für jede konstruktive Antwort!

arbu man 17. Feb 2005 13:13

Re: ScreenShot-Programm zu groß
 
Bei Google suchenupx wäre ne Lösung

Luckie 17. Feb 2005 13:14

Re: ScreenShot-Programm zu groß
 
Die größe des Auflösung des Bildschirms bekommst du auch mit [msdn]GetSystemMetrics] und den Flags SM_CXSCREEN, SM_CYSCREEN. Auf die Unit Windows wirst du nicht verzichten können, aber die macht deine Exe auch nicht "groß".

toms 17. Feb 2005 13:18

Re: ScreenShot-Programm zu groß
 
Delphi-Quellcode:
procedure ScreenShot(x: Integer;
  y: Integer; //(x, y) = Left-top coordinate
  Width: Integer;
  Height: Integer; //(Width-Height) = Bottom-Right coordinate
  bm: TBitMap); //Destination
var
  dc: HDC;
  lpPal: PLOGPALETTE;
begin
  {test width and height}
  if ((Width = 0) or
    (Height = 0)) then
    Exit;
  bm.Width := Width;
  bm.Height := Height;
  {get the screen dc}
  dc := GetDc(0);
  if (dc = 0) then
    Exit;
  {do we have a palette device?}
  if (GetDeviceCaps(dc, RASTERCAPS) and
    RC_PALETTE = RC_PALETTE) then
  begin
    {allocate memory for a logical palette}
    GetMem(lpPal,
      SizeOf(TLOGPALETTE) +
    (255 * SizeOf(TPALETTEENTRY)));
    {zero it out to be neat}
    FillChar(lpPal^,
      SizeOf(TLOGPALETTE) +
    (255 * SizeOf(TPALETTEENTRY)),
      #0);
    {fill in the palette version}
    lpPal^.palVersion := $300;
    {grab the system palette entries}
    lpPal^.palNumEntries :=
      GetSystemPaletteEntries(dc,
      0,
      256,
      lpPal^.palPalEntry);
    if (lpPal^.PalNumEntries <> 0) then
      {create the palette}
      bm.Palette := CreatePalette(lpPal^);
    FreeMem(lpPal, SizeOf(TLOGPALETTE) +
    (255 * SizeOf(TPALETTEENTRY)));
  end;
  {copy from the screen to the bitmap}
  BitBlt(bm.Canvas.Handle,
    0,
    0,
    Width,
    Height,
    Dc,
    x,
    y,
    SRCCOPY);
  {release the screen dc}
  ReleaseDc(0, dc);
end;

SirThornberry 17. Feb 2005 13:20

Re: ScreenShot-Programm zu groß
 
@arbu man: UPX ist KEINE Lösung denn dadruch wird nicht weniger speicher verbraucht sondern das Gegenteil tritt ein. Nur die Exe-Datei ist kleiner, aber da kann man noch eher winzip etc. nutzen.


Alle Zeitangaben in WEZ +1. Es ist jetzt 05:03 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