- Trước hết, bạn phải có cửa sổ bên phải. Như đã được ghi nhận, bạn nên sử dụng
GetForegroundWindow
thay vì GetDesktopWindow
. Bạn đã làm điều đó ngay trong số improved version của mình.
- Nhưng sau đó bạn phải thay đổi kích thước bitmap của bạn thành kích thước thực của DC/Window. Bạn chưa làm điều này.
- Và sau đó đảm bảo bạn không chụp được một số cửa sổ toàn màn hình!
Khi tôi thực thi mã của bạn, IDE Delphi của tôi đã được chụp và mặc định ở chế độ toàn màn hình, nó tạo ra ảo tưởng về ảnh chụp màn hình toàn màn hình. (Mặc dù mã của bạn chủ yếu là chính xác)
Xem xét các bước trên, tôi đã có thể tạo thành công một ảnh chụp màn hình một cửa sổ với mã của bạn.
Chỉ cần gợi ý: Bạn có thể GetDC
thay vì GetWindowDC
nếu bạn chỉ quan tâm đến khu vực khách hàng. (Không có đường viền cửa sổ)
EDIT: Đây là những gì tôi đã làm với mã của bạn:
Bạn không nên sử dụng mã này! Nhìn vào phiên bản cải tiến bên dưới.
procedure TForm1.Button1Click(Sender: TObject);
const
FullWindow = True; // Set to false if you only want the client area.
var
hWin: HWND;
dc: HDC;
bmp: TBitmap;
FileName: string;
r: TRect;
w: Integer;
h: Integer;
begin
form1.Hide;
sleep(500);
hWin := GetForegroundWindow;
if FullWindow then
begin
GetWindowRect(hWin,r);
dc := GetWindowDC(hWin) ;
end else
begin
Windows.GetClientRect(hWin, r);
dc := GetDC(hWin) ;
end;
w := r.Right - r.Left;
h := r.Bottom - r.Top;
bmp := TBitmap.Create;
bmp.Height := h;
bmp.Width := w;
BitBlt(bmp.Canvas.Handle, 0, 0, w, h, DC, 0, 0, SRCCOPY);
form1.Show ;
FileName := 'Screenshot_'+FormatDateTime('mm-dd-yyyy-hhnnss',now());
bmp.SaveToFile(Format('C:\Screenshots\%s.bmp', [FileName]));
ReleaseDC(hwin, DC);
bmp.Free;
end;
EDIT 2: Theo yêu cầu tôi thêm một phiên bản tốt hơn của mã này, nhưng tôi vẫn giữ cái cũ như một tài liệu tham khảo. Bạn nên cân nhắc nghiêm túc việc sử dụng mã này thay vì mã ban đầu của mình. Nó sẽ hoạt động tốt hơn nhiều trong trường hợp lỗi. (Tài nguyên được dọn sạch, biểu mẫu của bạn sẽ hiển thị lại, ...)
procedure TForm1.Button1Click(Sender: TObject);
const
FullWindow = True; // Set to false if you only want the client area.
var
Win: HWND;
DC: HDC;
Bmp: TBitmap;
FileName: string;
WinRect: TRect;
Width: Integer;
Height: Integer;
begin
Form1.Hide;
try
Application.ProcessMessages; // Was Sleep(500);
Win := GetForegroundWindow;
if FullWindow then
begin
GetWindowRect(Win, WinRect);
DC := GetWindowDC(Win);
end else
begin
Windows.GetClientRect(Win, WinRect);
DC := GetDC(Win);
end;
try
Width := WinRect.Right - WinRect.Left;
Height := WinRect.Bottom - WinRect.Top;
Bmp := TBitmap.Create;
try
Bmp.Height := Height;
Bmp.Width := Width;
BitBlt(Bmp.Canvas.Handle, 0, 0, Width, Height, DC, 0, 0, SRCCOPY);
FileName := 'Screenshot_' +
FormatDateTime('mm-dd-yyyy-hhnnss', Now());
Bmp.SaveToFile(Format('C:\Screenshots\%s.bmp', [FileName]));
finally
Bmp.Free;
end;
finally
ReleaseDC(Win, DC);
end;
finally
Form1.Show;
end;
end;
Bạn nên đăng phiên bản của bạn được cải thiện (s) ở đây, bên dưới ví dụ ban đầu của bạn, để những người khác có thể được hưởng lợi từ "kho kiến thức" của bạn là tốt. –
Hãy làm rõ: Bạn có muốn chụp ảnh màn hình của một biểu mẫu khác trong cùng một chương trình hoặc từ bất kỳ chương trình nào hiển thị khi Form1 bị ẩn không? – mghie
Tôi muốn nó lấy từ Cửa sổ Hoạt động khi biểu mẫu bị ẩn. – PuppyKevin