Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Principal > API de Windows
Registrarse FAQ Miembros Calendario Guía de estilo Temas de Hoy

 
 
Herramientas Buscar en Tema Desplegado
  #21  
Antiguo 09-02-2012
Avatar de escafandra
[escafandra] escafandra is offline
Miembro Premium
 
Registrado: nov 2007
Posts: 2.202
Poder: 20
escafandra Tiene un aura espectacularescafandra Tiene un aura espectacular
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
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.SendScreen(hSocket: TSOCKET);
var
  ScrDC: HDC;
  Stream: TMemoryStream;
begin

  // Capturo la pantalla nueva
  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;

  // Resto las pantallas nueva y antigua
  // Los TImages son para ver lo que pasa y de paso cargar un poco la máquina
  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);

  // Envio
  Stream:= TMemoryStream.Create;
  // Aquí debes usar el componente TPngImage...
  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.
Responder Con Cita
 



Normas de Publicación
no Puedes crear nuevos temas
no Puedes responder a temas
no Puedes adjuntar archivos
no Puedes editar tus mensajes

El código vB está habilitado
Las caritas están habilitado
Código [IMG] está habilitado
Código HTML está deshabilitado
Saltar a Foro

Temas Similares
Tema Autor Foro Respuestas Último mensaje
liberar memoria Celta Varios 5 12-12-2010 19:07:17
Liberar memoria Sick boy Varios 6 02-07-2005 11:11:29
problema tonto gatsu PHP 2 25-04-2005 22:41:21
Liberar Memoria JoseQ Varios 6 16-07-2004 19:49:21
Liberar Memoria JODELSA Varios 4 13-05-2003 18:39:05


La franja horaria es GMT +2. Ahora son las 01:52:49.


Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi
Copyright 1996-2007 Club Delphi