unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, ExtCtrls, StdCtrls;

type
  TForm1 = class(TForm)
    Button1: TButton;
    Timer1: TTimer;
    Memo1: TMemo;
    procedure Button1Click(Sender: TObject);
    procedure Timer1Timer(Sender: TObject);
    procedure FormDestroy(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

var
  lastRect: TRect;
  cursorClipped: Boolean = False;

procedure SetCursorRect(newRect: TRect);
begin
  if not cursorClipped then
  begin
    //Сохраняем старую область перемещения курсора
    GetClipCursor(lastRect);
    //Устанавливаем ограничение на перемещения курсора
    cursorClipped := ClipCursor(Addr(newRect)) <> FALSE;
  end;
end;
procedure RestoreCursorRect();
begin
  if cursorClipped then
  begin
    //Восстанавливаем область перемещения курсора
    cursorClipped := ClipCursor(Addr(lastRect)) = FALSE;
  end;
end;

procedure TForm1.Button1Click(Sender: TObject);
var
  rect: TRect;
begin
  //Ограничиваем область перемещения курсора примитивом
  //Shape1 до срабатывания таймера
  GetWindowRect(Memo1.Handle, rect);
  SetCursorRect(rect);

  Timer1.Enabled := True;
  Button1.Enabled := False;
end;

procedure TForm1.Timer1Timer(Sender: TObject);
begin
  Timer1.Enabled := False;
  Button1.Enabled := True;
  //Отменяем ограничения на перемещение курсора
  RestoreCursorRect();
end;

procedure TForm1.FormDestroy(Sender: TObject);
begin
  Timer1Timer(nil);
end;

end.
