Delphi - Как сделать снимок экрана активного окна в Delphi? - Qaru

Delphi - Как сделать снимок экрана активного окна в Delphi? - Qaru

Delphi - Как сделать снимок экрана активного окна в Delphi? - Qaru

Delphi - Как сделать снимок экрана активного окна в Delphi? - Qaru

Delphi - Как сделать снимок экрана активного окна в Delphi? - Qaru

  • Прежде всего, вы должны получить нужное окно. Как уже отмечалось, sharptooth следует использовать GetForegroundWindow вместо GetDesktopWindow. Вы сделали это прямо в своей улучшенной версии.
  • Но тогда вы должны изменить размер растрового изображения на фактический размер DC/Window. Вы еще этого не сделали.
  • И затем убедитесь, что вы не захватили какое-то полноэкранное окно!

Когда я выполнил ваш код, моя IDE Delphi была захвачена и, по умолчанию, на полноэкранном режиме, она создала иллюзию полноэкранного снимка экрана. (Даже если ваш код в основном правильный)

Учитывая вышеописанные шаги, я смог создать скриншот с одним окном с вашим кодом.

Просто подсказка: вы можете GetDC вместо GetWindowDC, если вас интересует только область клиента. (Без границ окна)

РЕДАКТИРОВАТЬ: Вот что я сделал с вашим кодом:

Вы не должны использовать этот код! Посмотрите на улучшенную версию ниже.

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;

16

ответ дан Daniel Rikowski 19 марта '09 в 10:27

источник поделиться

Как сделать delphi одним окном

Как сделать delphi одним окном

Как сделать delphi одним окном

Как сделать delphi одним окном

Как сделать delphi одним окном

Как сделать delphi одним окном

Как сделать delphi одним окном

Как сделать delphi одним окном

Как сделать delphi одним окном

Как сделать delphi одним окном

Как сделать delphi одним окном

Как сделать delphi одним окном

Как сделать delphi одним окном

Как сделать delphi одним окном

Как сделать delphi одним окном

Как сделать delphi одним окном