Creo que tu código puede simplificarse. No puedo correrlo en mi delphi 7 pero he realizado una prueba estable.
La prueba consiste en guardar la pantalla anterior, capturar una nueva, restar ambas y visualizar los resultados en 3 TImages. Al mismo tiempo Vuelco la resta en un TSream y simulo que lo envío por un socket. El proceso es repetido hasta la saciedad por un Timer a 100 ms.
Te expongo el código usado:
Código Delphi
[-]
unit Unit1;
interface
uses
Windows, WinSock, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, ExtCtrls;
type
TForm1 = class(TForm)
Image3: TImage;
Image1: TImage;
Image2: TImage;
Timer1: TTimer;
procedure FormCreate(Sender: TObject);
procedure SendScreen(hSocket: TSOCKET);
procedure Timer1Timer(Sender: TObject);
private
OldScreen, NewScreen, SubScreen: TBitmap;
primera_vez: boolean;
public
end;
var
Form1: TForm1;
implementation
{$R *.dfm}
procedure TForm1.SendScreen(hSocket: TSOCKET);
var
ScrDC: HDC;
Stream: TMemoryStream;
begin
ScrDC:= GetDc(0);
BitBlt(NewScreen.Canvas.handle, 0, 0, NewScreen.Width, NewScreen.Height, ScrDC, 0, 0, SRCCOPY);
ReleaseDC(0, ScrDC);
if primera_vez then
begin
OldScreen.Assign(NewScreen);
Form1.Image1.Picture.Bitmap.Assign(OldScreen);
primera_vez:= false;
exit;
end;
SubScreen.Handle := CreateSubstractBitmap(NewScreen.Canvas.Handle, OldScreen.Canvas.Handle);
Image1.Picture.Bitmap.Assign(OldScreen); Image1.Update;
Image2.Picture.Bitmap.Assign(NewScreen); Image2.Update;
Image3.Picture.Bitmap.Assign(SubScreen); Image3.Update;
OldScreen.Assign(NewScreen);
Stream:= TMemoryStream.Create;
SubScreen.SaveToStream(Stream);
send(hSocket, Pointer(Stream.Memory)^, Stream.Size, 0);
Stream.Free;
end;
procedure TForm1.FormCreate(Sender: TObject);
begin
OldScreen := TBitmap.Create;
SubScreen := TBitmap.Create;
NewScreen := TBitmap.Create;
OldScreen.Width := GetSystemMetrics(SM_CXSCREEN);
OldScreen.Height := GetSystemMetrics(SM_CYSCREEN);
NewScreen.Width := GetSystemMetrics(SM_CXSCREEN);
NewScreen.Height := GetSystemMetrics(SM_CYSCREEN);
primera_vez:= true;
end;
procedure TForm1.Timer1Timer(Sender: TObject);
begin
SendScreen(0);
end;
end.
Haz tus pruebas, seguro que no tienes fugas de memoria.
Saludos.