Как создать скриншот определенной области?

У меня есть код, который получает определенную область, уже определенную ранее на стороне сервера, и создает дыру в форме на стороне клиента. Вместо этого я хочу получить снимок экрана с этой же областью, но в конечном итоге моя форма не отображается, как при обычном захвате рабочего стола, но в этом случае будет сниматься только эта небольшая область.

Итак, как я могу адаптировать этот мой код ниже для этого?

procedure TForm1.CS1Read(Sender: TObject; Socket: TCustomWinSocket);
var
  X1, X2, Y1, Y2: Integer;
  List: TStrings;
  FormRegion, HoleRegion: HRGN;
  StrCommand: String;
begin
  StrCommand := Socket.ReceiveText;

  if Pos('§', StrCommand) > 0 then
  begin
    List := TStringList.Create;
    try
      FormRegion := CreateRectRgn(0, 0, Form12.Width, Form12.Height);
      ExtractStrings(['§'], [], PChar(StrCommand), List);

      X1 := StrToIntDef(List[0], 0) - Form12.Left - 2;
      Y1 := StrToIntDef(List[1], 0) - Form12.Top - 2;
      X2 := StrToIntDef(List[2], 0) - Form12.Left - 2;
      Y2 := StrToIntDef(List[3], 0) - Form12.Top - 2;

      HoleRegion := CreateRectRgn(X1, Y1, X2, Y2);
      CombineRgn(FormRegion, FormRegion, HoleRegion, RGN_DIFF);
      SetWindowRgn(Form12.Handle, FormRegion, True);
    finally
      List.Free;
    end;
  end;
end;
7 голосов | спросил user5404910 8 J000000Friday16 2016, 16:28:19

1 ответ


0

У меня нет всей вашей посторонней информации, но я могу показать вам, как записать содержимое региона в растровое изображение. Конечно, вам нужно будет корректировать координаты в соответствии с вашими потребностями. Возможно, вы захотите увидеть GetRgnBox, чтобы узнать, как получить ограничивающий прямоугольник всего региона после того, как вы их скомбинировали. Мой пример этого не делает, потому что у меня есть один регион.

В примере требуется два TButton и TImage на форме. Я измерил форму и разместил три компонента в коде, так что нет необходимости включать DFM. Однако вам нужно будет поместить компоненты в форму и подключить обработчики событий. : -)

Нажатие кнопки1 создаст прямоугольную область на форме, заполнит ее шаблоном типа сетки из красных линий и небольшим количеством текста, чтобы определить, где находится область. Нажатие второй кнопки нарисует копию содержимого этого региона на растровом изображении и назначит это растровое изображение элементу управления изображением.

unit Unit1;

interface

uses
  Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
  Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.StdCtrls, Vcl.ExtCtrls;

type
  TForm1 = class(TForm)
    Button1: TButton;
    Button2: TButton;
    Image1: TImage;
    procedure Button1Click(Sender: TObject);
    procedure FormCreate(Sender: TObject);
    procedure Button2Click(Sender: TObject);
  private
    { Private declarations }
    // Region coords
    R: TRect;
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

// Create the region (hole)
procedure TForm1.Button1Click(Sender: TObject);
var
  Region: HRGN;
begin
  Canvas.TextOut(R.Left + 60, R.Top + 60, 'Test text');
  Canvas.Brush.Style := bsCross;
  Canvas.Brush.Color := clRed;
  Region := CreateRectRgn(R.Left, R.Top, R.Right, R.Bottom);
  { 
    Note: Normally you'd want to check the result of the above API call
    and only proceed if it's not NULL (0). You'd also want to use a
    try..finally to make sure that the region was deleted properly.
    Omitted here because 
      a) This code was tested to work properly, and
      b) It's a demo app for doing something with the region and
         nothing else. If the call to create the region fails, the
         app is useless, and you'll close it anyway, which means
         the region will be automatically destroyed.
  }
  FillRgn(Canvas.Handle, Region, Canvas.Brush.Handle);
  DeleteObject(Region);
  Button2.Enabled := True;
end;

// Capture the region (hole) and display in the TImage.
procedure TForm1.Button2Click(Sender: TObject);
var
  Bmp: TBitmap;
begin
  Bmp := TBitmap.Create;
  try
    Bmp.SetSize(R.Right - R.Left, r.Bottom - R.Top);
    Bmp.Canvas.CopyRect(Rect(0, 0, Bmp.Width, Bmp.Height), Canvas, R);
    Image1.Picture.Assign(Bmp);
  finally
    Bmp.Free;
  end;
end;

// Set up the coordinates for the region (hole) in the form
procedure TForm1.FormCreate(Sender: TObject);
begin
  R := Rect(10, 40, 175, 175);
  // Size the image we'll use later to fit the rectangle. We set
  // the position below.
  Image1.Width := R.Right - R.Left;
  Image1.Height := R.Bottom - R.Top;

  Self.Height := 375;
  Self.Width := 350;
  Button1.Left := 238;
  Button1.Top := 16;
  Button2.Left := 238;
  Button2.Top := 48;
  Image1.Left := 160;
  Image1.Top := 190;
  // Disable the second button until the first has been clicked
  Button2.Enabled := False;
end;

end.
ответил Ken White 8 J000000Friday16 2016, 19:54:39

Похожие вопросы

Популярные теги

security × 330linux × 316macos × 2827 × 268performance × 244command-line × 241sql-server × 235joomla-3.x × 222java × 189c++ × 186windows × 180cisco × 168bash × 158c# × 142gmail × 139arduino-uno × 139javascript × 134ssh × 133seo × 132mysql × 132