AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Sprachen und Entwicklungsumgebungen Sonstige Fragen zu Delphi Delphi Screenshot von dem Clienten eines fremden Fensters machen

Screenshot von dem Clienten eines fremden Fensters machen

Offene Frage von "KahPee"
Ein Thema von KahPee · begonnen am 29. Jan 2010 · letzter Beitrag vom 29. Jan 2010
Antwort Antwort
Benutzerbild von KahPee
KahPee

Registriert seit: 12. Mai 2009
214 Beiträge
 
Turbo Delphi für Win32
 
#1

Screenshot von dem Clienten eines fremden Fensters machen

  Alt 29. Jan 2010, 15:06
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:
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;
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?

mfg Kahpee
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
43.017 Beiträge
 
Delphi 12 Athens
 
#2

Re: Screenshot von dem Clienten eines fremden Fensters mache

  Alt 29. Jan 2010, 15:14
Delphi-Quellcode:
iWidth := window.rcclient.right - window.rcClient.left + 1;
iHeight := window.rcclient.bottom - window.rcClient.top + 1;
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests
  Mit Zitat antworten Zitat
Benutzerbild von KahPee
KahPee

Registriert seit: 12. Mai 2009
214 Beiträge
 
Turbo Delphi für Win32
 
#3

Re: Screenshot von dem Clienten eines fremden Fensters mache

  Alt 29. Jan 2010, 15:18
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
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
43.017 Beiträge
 
Delphi 12 Athens
 
#4

Re: Screenshot von dem Clienten eines fremden Fensters mache

  Alt 29. Jan 2010, 15:33
Zumindestens sind diese beiden Variablen nun richtig berechnet.

Delphi-Quellcode:
window.cbSize := SizeOf(window);
if not GetWindowInfo(h, window) then
  ShowMessage(SysErrorMessage(getLastError));
siehe MSDN-Library durchsuchenGetWindowInfo

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.
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests
  Mit Zitat antworten Zitat
Benutzerbild von KahPee
KahPee

Registriert seit: 12. Mai 2009
214 Beiträge
 
Turbo Delphi für Win32
 
#5

Re: Screenshot von dem Clienten eines fremden Fensters mache

  Alt 29. Jan 2010, 15:39
Den Quellcode hab ich übernommen .

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
  Mit Zitat antworten Zitat
Benutzerbild von Aphton
Aphton

Registriert seit: 31. Mai 2009
1.198 Beiträge
 
Turbo Delphi für Win32
 
#6

Re: Screenshot von dem Clienten eines fremden Fensters mache

  Alt 29. Jan 2010, 16:09
Heißt das nicht so?
    BitBlt(Canvas.Handle, 0, 0, iWidth, iHeight, GetWindowDC(h), left, top, SRCCOPY);
das Erkennen beginnt, wenn der Erkennende vom zu Erkennenden Abstand nimmt
MfG
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
43.017 Beiträge
 
Delphi 12 Athens
 
#7

Re: Screenshot von dem Clienten eines fremden Fensters mache

  Alt 29. Jan 2010, 16:11
stümmt ...

probier es mal so:

Delphi-Quellcode:
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);
[edit]
neee, müßte eigentlich die Breite sein.
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests
  Mit Zitat antworten Zitat
Benutzerbild von KahPee
KahPee

Registriert seit: 12. Mai 2009
214 Beiträge
 
Turbo Delphi für Win32
 
#8

Re: Screenshot von dem Clienten eines fremden Fensters mache

  Alt 29. Jan 2010, 19:58
So funktioniert es. Diese Prozedur macht jetzt einen Screenshot vom Clienten und nicht vom Fenster!

Delphi-Quellcode:
// *** 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;
Der Hinweis von oben war gut.. der hat mich auf die richtige Spur gebracht
  Mit Zitat antworten Zitat
Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche
Ansicht

Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 12:48 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