![]() |
Screenshot von dem Clienten eines fremden Fensters machen
Hallo,
ich möchte einen Screenshot von dem Clienten eines fremden Fensters machen, welches ich mit einem Handle anspreche. (also einen Screen ohne titlebar und borders). Dazu habe ich mir das hier zusammen-geschrieben/kopiert:
Delphi-Quellcode:
Das ausgebene Bitmap hat jetzt allerdings rechts einen weißen Rand (recht schmal, ungefähr die Borderdicke [evtl. nen bisschen mehr]) und außerdem habe ich den Eindruck, dass er eine ein oder zwei pixelbreite spalte des clienten rechts nicht abbildet. Wisst ihr wo der Fehler liegt?
function TForm1.FormularSaveScreenShot(FileName: String; h : hWnd): Boolean;
var Rec: TRect; iWidth, iHeight,left,top: Integer; window: TWindowInfo; begin GetWindowInfo(h,window); with TBitmap.Create do try GetWindowRect(h, Rec); iWidth := window.rcclient.right-window.rcClient.left; iHeight := window.rcclient.bottom-window.rcClient.top; left:=window.rcWindow.Left-window.rcclient.Left; top:=window.rcwindow.Top-window.rcClient.top; Width := iWidth; Height := iHeight; BitBlt(Canvas.Handle, left, top, iWidth, iHeight, GetWindowDC(h), 0, 0, SRCCOPY); Result := True; try SaveToFile(Filename) except Result := False end; finally ReleaseDC(h, GetWindowDC(h)); Free; end; end; mfg Kahpee |
Re: Screenshot von dem Clienten eines fremden Fensters mache
Delphi-Quellcode:
iWidth := window.rcclient.right - window.rcClient.left + 1;
iHeight := window.rcclient.bottom - window.rcClient.top + 1; |
Re: Screenshot von dem Clienten eines fremden Fensters mache
Das löst das Problen nicht. Weiterhin weiße Ränder. Außerdem geht es um mehr als einen Pixel
Ich habe grad gesehen, dass unten auch ein ordentliches Stück fehlt. Dort ist ebenfalls ein weißer Rand (ca. Höhe der Titelbar). Und auch dort fehlt ein stück des Clienten |
Re: Screenshot von dem Clienten eines fremden Fensters mache
Zumindestens sind diese beiden Variablen nun richtig berechnet. :stupid:
Delphi-Quellcode:
siehe
window.cbSize := SizeOf(window);
if not GetWindowInfo(h, window) then ShowMessage(SysErrorMessage(getLastError)); ![]() Und was soll das bei ReleaseDC? (nochein neues Handle besorgen nd dieses freigeben ... was ist mit dem anderen Handle? ) Dein Try-Except ist auch "toll" ... die Information, daß nicht gespeichert werden konnte ist ja nett, aber warum konnte es das nicht? (diese Information hast du damit zerstört) Abgesehn davon prüfst du nirgends, ob die Aufrufe der WinAPIs überhaupt erfolgreich waren. |
Re: Screenshot von dem Clienten eines fremden Fensters mache
Den Quellcode hab ich übernommen :P.
Die Anfragen scheinen aber anzukommen, weil zumindest die obere linke ecke des Screenshots der oberen linken Ecke des Clienten entspricht. Im Prinzip stimmt nur die untere rechte Ecke des Screens und des Clienten noch nicht. mfg Kahpee |
Re: Screenshot von dem Clienten eines fremden Fensters mache
Heißt das nicht so?
Delphi-Quellcode:
BitBlt(Canvas.Handle, 0, 0, iWidth, iHeight, GetWindowDC(h), left, top, SRCCOPY);
|
Re: Screenshot von dem Clienten eines fremden Fensters mache
stümmt ...
probier es mal so:
Delphi-Quellcode:
[edit]
h2 := GetWindowDC(h);
iWidth := window.rcclient.right - window.rcClient.left + 1; iHeight := window.rcclient.bottom - window.rcClient.top + 1; left := window.rcWindow.Left - window.rcclient.Left; top := window.rcwindow.Top - window.rcClient.top; Width := iWidth; Height := iHeight; BitBlt(Canvas.Handle, left, top, left + iWidth - 1, top + iHeight - 1, h2, 0, 0, SRCCOPY); ... ReleaseDC(h, h2); neee, müßte eigentlich die Breite sein. :gruebel: |
Re: Screenshot von dem Clienten eines fremden Fensters mache
So funktioniert es. Diese Prozedur macht jetzt einen Screenshot vom Clienten und nicht vom Fenster!
Delphi-Quellcode:
Der Hinweis von oben war gut.. der hat mich auf die richtige Spur gebracht
// *** Erstellt von einem Clienten ein ScreenShot ***
function TForm1.FormularSaveScreenShot(FileName: String; h : hWnd): Boolean; var Rec: TRect; iWidth, iHeight,left,top: Integer; window: TWindowInfo; begin GetWindowInfo(h,window); with TBitmap.Create do try GetWindowRect(h, Rec); iWidth := window.rcclient.right-window.rcClient.left+1; iHeight := window.rcclient.bottom-window.rcClient.top+1; left:=window.rcWindow.Left-window.rcclient.Left; top:=window.rcwindow.Top-window.rcClient.top; Width := iWidth; Height := iHeight; BitBlt(Canvas.Handle, left, top, iWidth-left-1, iheight-top-1, GetWindowDC(h), 0, 0, SRCCOPY); Result := True; try SaveToFile(Filename) except Result := False end; finally ReleaseDC(h, GetWindowDC(h)); Free; end; end; |
Alle Zeitangaben in WEZ +1. Es ist jetzt 04:44 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