PDA

Просмотр полной версии : скриншот рабочего стола, с обновлением


Leon2009
14.01.2010, 21:50
Здравствуйте можете помочь? делаю скрин рабочего стола.

procedure TForm1.Timer1Timer(Sender: TObject);
var
bmp: TBitmap;
DC: HDC;
Jpg: TJpegImage;
Begin
Try
bmp:= TBitmap.Create;
Jpg:= TJpegImage.Create;
bmp.Height:=Screen.Height;
bmp.Width:=Screen.Width;
DC:=GetDC(0);
bitblt(bmp.Canvas.Handle, 0, 0, Screen.Width, Screen.Height,
DC, 0, 0, SRCCOPY);
Jpg.Assign(Bmp);
Jpg.SaveToFile('test.jpg');
image1.Picture.Assign(Jpg);
ReleaseDC(0, DC);
finally
Bmp.Free;
jpg.Free;
form1.Image1.Picture:=nil; не знаю куда ее поставить????
End;
end;

все работает но только есть глюк: первый снимак делает хорошо, а остальные начинают уменьшатся. если ставлю nil то вообще ничго не появляется. как делать обновление???? Спасибо!

=Zeus=
15.01.2010, 01:09
Они не уменьшаются. Ты подумай: ты делаешь скрин. а потом скрин в котором есть скрин. А потом скрин скрина скрина... и тд. Все вообщем норм, это просто оптическая иллюзия.

Leon2009
15.01.2010, 04:42
и как хоть с ней справлятся? что делать :confused:
как сделать правельно. чтобы не из скрина скрин делать, а скрин рабочего стола?
а то видео ни какого не получается :D
а как канву почистить незнаю. вернее знаю тока незнаю как в код в писать.
Спасибо!

=Zeus=
15.01.2010, 21:18
да возьми подвигай окном своим во время захвата, увидишь что все норм. на скрине оно тоже двигается.

Leon2009
15.01.2010, 22:31
подвигал я окном! вылетает табличка, точно не перевел, но в переводчике - "что то там закончилось" :confused:
ладно потом испралю :rolleyes:

а как передать через сокеты изображение из server -> Image1 в client -> image1 :confused:
без сохранение файла.
Сервер

var
Size: integer;
P: ^Byte;
begin
MS := TMemoryStream.Create; // Создаём буфер для файла
MS.LoadFromFile(Edit1.Text); // Загружаем файл в буфер
// Посылаем информацию о файл (команда # название # размер)
ServerSocket1.Socket.Connections[0].SendText('file#'+Edit1.Text+'#'+IntToStr(MS.Size) +'#');
MS.Position := 0; // Переводим каретку в начало файла
P := MS.Memory; // Загружаем в переменную "P" файл
Size := ServerSocket1.Socket.Connections[0].SendBuf(P^, MS.Size); // Посылаем файл
// Выводим прогресс
ProgressBar1.Position := Size*100 div MS.Size;
StatusBar1.SimpleText := 'Отправлено '+IntToStr(Size)+' из '+IntToStr(MS.Size)+' байт'

Клиент

procedure TForm1.Writing(Text: string);
begin
if MS.Size < Size then // Если принято байт меньше размера файла, то...
MS.Write(Text[1], Length(Text)); // Записываем в буфер
// Выводим прогресс закачки файла
ProgressBar1.Position := MS.Size*100 div Size;
StatusBar1.SimpleText := 'Принято '+IntToStr(MS.Size)+' из '+IntToStr(Size);
if MS.Size = Size then // Если файл принят, то...
begin

Receive := false; // Переводим клиента в нормальный режим
MS.Position := 0; // Переводим каретку в начало буфера
MS.SaveToFile(Name); // Сохраняем файл
image1.Picture.LoadFromFile(name);
ClientSocket1.Socket.SendText('end'); // Посылаем команду "end", то есть файл принят
MS.Free; // Убиваем буфер
StatusBar1.SimpleText := 'Файл принят';

end;
end;

procedure TForm1.ClientSocket1Read(Sender: TObject;
Socket: TCustomWinSocket);
var
Rtext: string; // Принятый текст
begin
Rtext := Socket.ReceiveText;
if Receive then // Если клиент в режиме приёма файла, то...
Writing(RText) // Записываем данные в буфер
else // Если клиент не в режиме приёма файла, то...
if Copy(Rtext, 0, Pos('#', Rtext) -1) = 'file' then // Если это файл, то...
begin MS := TMemoryStream.Create; // Создаём буфер для файла
Delete(Rtext, 1, Pos('#', Rtext)); // Определяем имя файла
Name := Copy(Rtext, 0, Pos('#', Rtext) -1); // Определяем имя файла
Delete(Rtext, 1, Pos('#', Rtext)); // Определяем размер файла
Size := StrToInt(Copy(Rtext, 0, Pos('#', Rtext) -1)); // Определяем размер файла
Delete(Rtext, 1, Pos('#', Rtext)); // Удаляем последний разделитель
Label1.Caption := 'Размер файла: '+IntToStr(Size)+' байт'; // Выводим размер файла
Label2.Caption := 'Имя файла: '+Name; // Выводим имя файла
Receive := true; // Переводим сервер в режим приёма файла
Writing(RText); // Записываем данные в буфер
end;

end;


Спасибо! :)