2017-02-02 8 views
3

私は特定のウィンドウをキャプチャするこのコードを持っています、ウィンドウは成功とキャプチャされますが、ウィンドウの一部だけが表示されます。ウィンドウを完全にキャプチャする方法は?

解決方法

ありがとうございます。

procedure ScreenShotWindow; 
var 
    c: TCanvas; 
    r, t: TRect; 
    h: THandle; 
    Bild: TBitMap; 
begin 
    c := TCanvas.Create; 
    h := FindWindow(nil, 'Untitled - Notepad'); 
    c.Handle := GetWindowDC(h); 
    GetWindowRect(h, t); 
    try 
    r := Rect(0, 0, t.Right - t.Left, t.Bottom - t.Top); 
    Bild := TBitMap.Create; 
    try 
     Bild.Width := t.Right - t.Left; 
     Bild.Height := t.Bottom - t.Top; 
     Bild.Canvas.CopyRect(r, c, t); 
     Bild.SaveToFile('test'+ RandomPassword(10)+'.bmp'); 
    finally 
     Bild.Free; 
    end; 
    finally 
    ReleaseDC(0, c.Handle); 
    c.Free; 
    end; 
end; 

enter image description here

答えて

5

あなたが不要な、過度に複雑なコードの多くを持っています。

これは私の作品:

procedure ScreenShotWindow; 
var 
    DC: HDC; 
    wRect: TRect; 
    Bmp: TBitmap; 
    Width, Height: Integer; 
    H: HWnd; 
begin 
    H := FindWindow(nil, 'Untitled - Notepad'); 
    if H = 0 then 
    raise Exception.Create('FindWindow failed.'); // GetLastError would tell you why. 
                // I leave that to you to add if needed 

    DC := GetWindowDC(H); 
    try 
    Bmp := TBitmap.Create; 
    try 
     GetWindowRect(H, wRect); 
     Width := wRect.Right - wRect.Left; 
     Height := wRect.Bottom - wRect.Top; 
     Bmp.SetSize(Width, Height); 
     BitBlt(Bmp.Canvas.Handle, 0, 0, Width, Height, DC, 0, 0, SRCCOPY); 
     Bmp.SaveToFile('test' + RandomPassword(10) + '.bmp'); 
    finally 
     Bmp.Free; 
    end; 
    finally 
    ReleaseDC(H, DC); 
    end; 
end; 
+0

が、これは働いていた、あなたに@Kenホワイトありがとうございます。 –

関連する問題