![]() |
Speicher freigeben...
Hi!
Ich mache mit folgendem Code einen Screenshot vom Aktuellen Desktop in einem bestimmten Intervall (z.B. alle 100 ms)... doch nach einer bestimmten Zeit ist natürlich der Arbeitsspeicher voll :-D ... Nun meine Frage: Wie kann ich in diesem Beispiel den Arbeitsspeicher wieder freigeben???
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; procedure TForm1.Button1Click(Sender: TObject); begin CaptureScreen.SaveToFile('C:\\meinbild.bmp'); end; |
Re: Speicher freigeben...
So?
Delphi-Quellcode:
Etwas sauberer wäre es allerdings, die Bitmap in der ButtonClick-Methode zu erzeugen und freizugeben. Das Bitmap-Objekt wird dann als Parameter an die Prozedur(!) CaptureScreen übergeben. Für den periodischen Vorgang (100 ms) würde es auch genügen, zu Beginn (FormCreate) einmal eine TBitmap-Instanz zu erzeugen und diese für alle Capture-Operationen zu verwenden. Am Ende (FormDestroy) kann die Bitmap wieder freigegeben werden.
procedure TForm1.Button1Click(Sender: TObject);
begin with CaptureScreen do try SaveToFile('C:\\meinbild.bmp'); finally Free; end; end; Gruß Hawkeye |
Alle Zeitangaben in WEZ +1. Es ist jetzt 05:21 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz