- Прежде всего, вы должны получить правильное окно. Как уже отмечал острый зуб, вы должны использовать
GetForegroundWindow
вместо GetDesktopWindow
. Вы все сделали правильно в своей улучшенной версии.
- Но тогда вам нужно изменить размер растрового изображения до фактического размера DC/Window. Вы еще этого не сделали.
- И затем убедитесь, что вы не захватываете какое-то полноэкранное окно!
Когда я выполнил ваш код, моя среда разработки Delphi была захвачена, и, поскольку по умолчанию она находится в полноэкранном режиме, она создала иллюзию полноэкранного снимка экрана. (Хотя ваш код в основном правильный)
Принимая во внимание описанные выше шаги, я успешно смог создать снимок экрана с одним окном с помощью вашего кода.
Подсказка: вы можете GetDC
вместо GetWindowDC
, если вас интересует только клиентская область. (Без границ окна)
EDIT: Вот что я сделал с вашим кодом:
Не используйте этот код! Посмотрите на улучшенную версию ниже.
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;
РЕДАКТИРОВАТЬ 2: В соответствии с просьбой я добавляю улучшенную версию кода, но сохраняю старую в качестве ссылки. Вы должны серьезно подумать об использовании этого вместо исходного кода. В случае ошибок он будет вести себя намного лучше. (Ресурсы очищены, ваша форма снова будет видна, ...)
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;
person
Daniel Rikowski
schedule
19.03.2009