2014-05-01 99 views
1

我想使用此代碼德爾福活動窗口截圖

procedure ScreenShot(activeWindow: bool; destBitmap : TBitmap) ; 
var 
    w,h : integer; 
    DC : HDC; 
    hWin : Cardinal; 
    r : TRect; 
begin 
    if activeWindow then 
    begin 
     hWin := GetForegroundWindow; 
     dc := GetWindowDC(hWin) ; 
     GetWindowRect(hWin,r) ; 
     w := r.Right - r.Left; 
     h := r.Bottom - r.Top; 
    end 
    else 
    begin 
     hWin := GetForegroundWindow; 
     dc := GetDC(hWin) ; 
     w := GetDeviceCaps (DC, HORZRES) ; 
     h := GetDeviceCaps (DC, VERTRES) ; 
    end; 

    try 
    destBitmap.Width := w; 
    destBitmap.Height := h; 
    BitBlt(destBitmap.Canvas.Handle, 
      0, 
      0, 
      destBitmap.Width, 
      destBitmap.Height, 
      DC, 
      0, 
      0, 
      SRCCOPY) ; 
    finally 
    ReleaseDC(hWin, DC) ; 
    end; 
end; 

而且在Button1的我使用添加活動窗口的捕捉截屏:

var 
    path:string; 
    b:TBitmap; 
begin 
    path:= ExtractFilePath(Application.ExeName) + '/Screenshot/'; 
    b := TBitmap.Create; 
    try 
    ScreenShot(TRUE, b) ; 
    b.SaveToFile(path + 'Screenshot_1.png'); 
    finally 
    b.FreeImage; 
    FreeAndNil(b) ; 
    end; 
end; 

它做工不錯唯一的問題是它不能捕捉稱號巴:(

這裏到處是活動窗口視圖:

enter image description here

這裏是我從該代碼

enter image description here

如果我做錯了什麼?得到

+0

參見[這個答案](HTTP測試://計算器。com/q/16700014/62576)到一個類似的問題。它應該有所幫助。 –

+0

改爲使用'GetWindowDC'。 –

+0

@KenWhite在答案中的代碼給我錯誤在Bitmap.SetSize(寬度,高度);說Undeclared標識符:'SetSize' – dudey

回答

2

我已經測試並得到了相同的結果。

enter image description here

原件邊境

enter image description here

但是,如果你設置

sSkinProvider1.AllowExtBorders:=False; 

你沒有透明roundet邊框的屏幕截圖。

enter image description here

然後重新設置

sSkinProvider1.AllowExtBorders:=True; 

沒有必要,一個第二

Form1.Repaint; 

你會看到只有很短的開關後做。

procedure TForm1.BitBtn1Click(Sender: TObject); 
var 
    path:string; 
    b:TBitmap; 
begin 
    sSkinProvider1.AllowExtBorders:=False; 
    Form1.Repaint; 
    path:= ExtractFilePath(Application.ExeName) + 'Screenshot\'; 
    b := TBitmap.Create; 
    try 
    ScreenShot(TRUE, b) ; 
    b.SaveToFile(path + 'Screenshot_1.png'); 
    finally 
    b.FreeImage; 
    FreeAndNil(b) ; 
    sSkinProvider1.AllowExtBorders:=True; 
[...] 

btw。不設置路徑類似

path:= ExtractFilePath(Application.ExeName) + '/Screenshot/'; 

使用windows風格的反斜線只有一個

path:= ExtractFilePath(Application.ExeName) + 'Screenshot\'; 

與Delphi5

+0

好吧,這是很好的技巧;)我沒有想過這個之前反正thx to @kenwhite也 - 問題解決(Y) – dudey

3

我不知道你使用的是什麼樣的視覺樣式組件(表單圖標表示它是Delphi 7,但是)。

此代碼的工作完美的我:

function CaptureWindow(const WindowHandle: HWnd): TBitmap; 
var 
    DC: HDC; 
    wRect: TRect; 
    Width, Height: Integer; 
begin 
    DC := GetWindowDC(WindowHandle); 
    Result := TBitmap.Create; 
    try 
    GetWindowRect(WindowHandle, wRect); 
    Width := wRect.Right - wRect.Left; 
    Height := wRect.Bottom - wRect.Top; 
    Result.Width := Width; 
    Result.Height := Height; 
    Result.Modified := True; 
    BitBlt(Result.Canvas.Handle, 0, 0, Width, Height, DC, 0, 0, SRCCOPY); 
    finally 
    ReleaseDC(WindowHandle, DC); 
    end; 
end; 

procedure TForm1.Button1Click(Sender: TObject); 
var 
    Capture: TBitmap; 
begin 
    // For active window, change Handle to GetForegroundWindow() 
    Capture := CaptureWindow(Handle); 
    try 
    Capture.SaveToFile('E:\TempFiles\ScreenCapture2014.bmp'); 
    finally 
    Capture.Free; 
    end; 
end; 

這是我所拍攝的圖像:

Sample form window capture

+0

嗨它的alphaskins /德爾福7即時通訊使用 當我從窗體中刪除蒙皮組件它捕獲所有形式 – dudey

+0

似乎AlphaSkins干擾正常捕獲的東西然後,對不起 - 我沒有在這裏安裝Delphi 7,也沒有AlphaSkins在任何地方,所以我無法幫助你,也許應該編輯你的原始問題以包含這些信息。 –