2016-07-08 4 views
8

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

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

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; 

ответ

6

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

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

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

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. 
+0

большое спасибо. –