2016-08-12 1 views
0

Ich brauche außerhalb der Anwendung Screenshot:Screenshot bestimmter Bereich des Bildschirms nur Screenshots oben links?

X: centerOfScreen-100 bis centerOfScreen + 100
Y: centerOfScreen-100 bis centerOfScreen + 100

function GetSCREENSHOT: TBitmap; 
var 
    Locked: Boolean; 
    Canvas: TCanvas; 
    R: TRect; 
begin 
    Result := TBitmap.Create; 
    Result.Width := 200; 
    Result.Height := 200; 
    Canvas := TCanvas.Create; 
    Canvas.Handle := GetDC(0); 
    Locked := Canvas.TryLock; 
    try 
    // just a poor example 
    R := Rect(1280 div 2 - 100, 720 div 2 - 100, 1280 div 2 + 100, 720 div 2 + 100); 
    Result.Canvas.CopyRect(R, Canvas, R); 
    finally 
    if Locked then 
     Canvas.Unlock; 
    ReleaseDC(0, Canvas.Handle); 
    Canvas.Free; 
    end; 
end; 

Ich weiß, es ist schlecht jetzt geschrieben, nur zum Testen. I c & p den größten Teil des Codes und ich kann nicht herausfinden, warum es nur den oberen linken Bereich meines Bildschirms kopiert.

GetDC (0) gibt den DC des gesamten Bildschirms zurück ... richtig? Was mache ich falsch?

+1

"nur Copys" irgendwie widerspricht mit Ihrer Frage. Entweder kopiert es den oberen linken Bereich oder es kopiert die Mitte Ihres Bildschirms oder kopiert es den oberen linken Bereich der Mitte des Bildschirms? * G * – ViRuSTriNiTy

+1

Es kopiert nur den oberen linken Bereich. Das heißt, ich muss die Funktion wie folgt aufrufen: 'R: = Rect (0, 0, 1280 div 2 + 100, 720 div 2 + 100);' und dann funktioniert es. Sein Verhalten ist seltsam, gibt es eine Möglichkeit, dass Sie oben links beginnen müssen, um zu erfassen, bevor Sie noch etwas aufnehmen können? Aber genau das wollte ich vermeiden - nicht benötigte Bereiche des Bildschirms erfassen ... – XYZ

+0

Code kann entweder schlecht geschrieben oder von einer anderen Stelle kopiert werden. Welcher Fall? –

Antwort

1

Dieser Code, was Bereich des Desktops erfaßt angegeben wird, legt es in eine TBitmap und Displays, die in einem TImage auf dem Formular Bitmap.

(Ich nahm nur eine 400 x 400 Pixelfläche in Position zu Demonstrations 100, 100 beginnen, aber es funktioniert mit als auch in anderen Bereichen. Passen Sie, wie Sie benötigen.)

procedure TForm1.Button1Click(Sender: TObject); 
var 
    DeskDC: HDC; 
    SrcRect, DestRect: TRect; 
    DeskCanvas: TCanvas; 
    Bmp: TBitmap; 
begin 
    DeskDC := GetDC(GetDesktopWindow); 
    try 
    DeskCanvas := TCanvas.Create; 
    DeskCanvas.Handle := DeskDC; 

    SrcRect := Rect(100, 
        100, 
        500, 
        500); 
    DestRect := Rect(0, 
        0, 
        SrcRect.Right - SrcRect.Left, 
        SrcRect.Bottom - SrcRect.Top); 

    Bmp := TBitmap.Create; 
    try 
     Bmp.SetSize(DestRect.Width, DestRect.Height); 
     Bmp.Canvas.CopyRect(DestRect, DeskCanvas, SrcRect); 
     Image1.Picture.Assign(Bmp); 
    finally 
     Bmp.Free; 
    end; 
    finally 
    ReleaseDC(GetDesktopWindow, DeskDC); 
    end; 
end; 

Um zu zeigen, dass es funktioniert gut auf jedem Bildschirmbereich, dieser Code wird auch die untere rechte Ecke meines sekundären Monitors mit dieser Änderung erfassen:

SrcRect := Rect(Screen.DesktopWidth - 500, 
       Screen.DesktopHeight - 500, 
       Screen.DesktopWidth - 100, 
       Screen.DesktopHeight - 100); 
+0

Ja danke Ich habe es als die angenommene Antwort markiert. Rudy Velthuis wies darauf hin, dass der Fehler in "meiner" Funktion "Result.Canvas.CopyRect (R, Canvas, R)" war. Ich c & p'd den Code und es wurde ursprünglich verwendet, um den gesamten Desktop zu erfassen, indem Sie kleine Teile des Bildschirms erfassen und zusammensetzen, anstatt einen großen Screenshot zu machen. Also hat es "R" in CopyRect als Offset für den nächsten Teil verwendet. – XYZ

0

ich diesen Code verwenden gesamten Desktop zu kopieren:

DeskTop := TCanvas.Create; 
    Bmp := TBitmap.Create; 
    Bmp.Width := Screen.DesktopWidth; 
    Bmp.Height := Screen.DesktopHeight; 
    try 
    with DeskTop do 
     Handle := GetWindowDC(GetDesktopWindow); 
    with Bmp.Canvas do 
     CopyRect(Rect(0, 0,Bmp.Width , Bmp.Height),DeskTop, Screen.DesktopRect); 
    ..... 
    finally 
    Bmp.Free; 
    DeskTop.Free; 
    end 
+0

Ja, die Bewältigung des gesamten Desktops ist für mich kein Problem. Ich muss ein bestimmtes Rechteck des Desktops erfassen, ohne den Raum um – XYZ

+0

zu erfassen. Sie müssen also nur CopyRect-Parameter ersetzen: CopyRect (Rect (0, 0,200, 200), DeskTop, Rect (Bildschirm.DesktopWidth div 2 -100, Bildschirm. DesktopHeight div 2 -100, Bildschirm.DeskTopWidth div 2 + 100, BildschirmDesktopHeight div 2 + 100); –

+0

Oder genauer: Rect (Screen.DesktopLeft + Screen.DesktopWidth div 2 -100, Screen.DesktopRight + Screen. DesktopHeight div 2 -100, ....usw. –

Verwandte Themen