Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2003.08.21;
Скачать: CL | DM;

Вниз

Как получить ScreenShort программно...   Найти похожие ветки 

 
mOOx   (2003-08-07 17:19) [0]

Добрый день, Мастера.
Возникла необходимость программно сотворить СкринШот и каким-либо образом поместить его в TImage (ну или на худой конец :) в TPaintBox). Долго уже мучаюсь. Может у кого-то был опыт в этом направлении? Плз, хелп...


 
Rouse_ ©   (2003-08-07 17:27) [1]

FAQ

Желаю успехов в поиске


 
Skier ©   (2003-08-07 17:29) [2]

GetDC(0) + BitBlt(...) + ReleaseDC(0,...)


 
mOOx   (2003-08-08 11:48) [3]

ТО ЧТО НАДО !!! Действительно мастера! Пожалую я тут пропишусь. Вот только один момент меня в этой схеме не устраивает: рисую я прямо на GroupBox"е и мне бы надо, чтобы вся эта картинка ужималась до определенных рамок. Так скрин просто рисуется в облости, которую я задаю, соответственно не уменьшаясь. Большие надежды возлагаю на Skier"а.........


 
Yanis ©   (2003-08-08 11:52) [4]

To mOOx (08.08.03 11:48)
>рисую я прямо на GroupBox"е
что ничего более подходящего не нашел, что бы рисовать?


 
pasha_golub ©   (2003-08-08 11:59) [5]

ScreenShort - это чего, короткий экран что-ли?


 
mOOx   (2003-08-08 12:00) [6]

А кака разница? Мень компонентов, меньше памяти... К тому же эту проблему я уже решил. Теперь другая. Можно ли это полученное устройство передать в буфер или в поток загнать? Дело в том, что мне это изображение теперь по сетке передать надо...


 
mOOx   (2003-08-08 12:02) [7]

ScreenShort - это типа снимок экрана. Ну не виноват я что его так называют :).


 
mOOx   (2003-08-08 12:08) [8]

По сути, мне его даже и рисовать то не надо. Просто получить снимок в некий буфер, затем произвести над ним кое-какие противоестественные вещи и затем из этого буфера не важно где и на чем нарисовать картинку. Как мне такое-то реализовать?


 
Семен Сорокин ©   (2003-08-08 12:15) [9]

mOOx (08.08.03 11:48)
StretchDraw


 
Rouse_ ©   (2003-08-08 12:23) [10]

Блин, ты не торопись. Тебе нужно его по сетке передать или что?
Так как...
> mOOx (08.08.03 12:08) - Вот этого вообще не понял...

А называть правильно нужно ScreenShot (Screen - экран, Shot - снимок (не путать с выстрелом)) - Снимок экрана.

Желаю успехов


 
mOOx   (2003-08-08 12:31) [11]

Извиняюсь за ошибку (просто забыл как пишется :) ). Ну да, в общем, мне нужно отслеживать, что запущено на клиентской машине. Можно, конечно просто преедавать заголовки всех запущенных окон, тока этого мало. Хотелось бы ще и наглядно это представить. Соединение между сервером и клиентом устанавливается с помощью ServerSocket and ClientSocket.


 
Yanis ©   (2003-08-08 12:46) [12]

To mOOx (08.08.03 12:08)
Если уж памяти не жалко :)) то используй Image, с Visible:=False.
И работай с рисунком в Image.


 
mOOx   (2003-08-08 12:56) [13]

Это, конечно, вариант, но что-то я последнее время стал жадным до паняти. Да и, кстати, если я таким же способом нарисую в Инаже, то не уверен, что картинка будет доступна через свойства TImage(хотя я не пробовал :) ).


 
Rouse_ ©   (2003-08-08 12:56) [14]

Вот тебе прием и отправка на базе TClientSocket и TServerSocket из палитры Internet (D6).

procedure TForm1.FormCreate(Sender: TObject);
begin
// Открытие ОТПРАВЛЯЮЩЕГО (SENDING) сокета.
ServerSocket1.Active:= true;
end;

procedure TForm1.ClientSocket1Connect(Sender: TObject;
Socket: TCustomWinSocket);
begin
// Посылаем команду для начала передачи файла.
Socket.SendText("send");
end;

procedure TForm1.ClientSocket1Read(Sender: TObject;
Socket: TCustomWinSocket);
var
s, sl: string;
begin
s:= Socket.ReceiveText;
// Если мы не в режиме приёма данных а в режиме приема заголовка:
if not Reciving then
begin
// получаем длину потока данных.
SetLength(sl, StrLen(PChar(s))+1); // +1 для метки конца служебных данных
StrLCopy(@sl[1], PChar(s), Length(sl)-1);
DataSize:= StrToInt(sl);
Data:= TMemoryStream.Create;
// Удаляем информацию о размере из данных.
Delete(s, 1, Length(sl));
Reciving:= true;
end;
// Сохраняем данные в поток, до тех пор, пока не получим все данные.
try
Data.Write(s[1], length(s));
if Data.Size = DataSize then
begin
Data.Position:= 0;
Image2.Picture.Bitmap.LoadFromStream(Data);
Data.Free;
Reciving:= false;
Socket.Close;
end;
except
Data.Free;
end;
end;

procedure TForm1.ServerSocket1ClientRead(Sender: TObject;
Socket: TCustomWinSocket);
var
ms: TMemoryStream;
begin
// Клиент получает команду на передачу файла.
if Socket.ReceiveText = "send" then
begin
ms:= TMemoryStream.Create;
try
// Получаем данные на передачу.
// Здесь я поставил картинку, можно использовать и скриншот экрана
Image1.Picture.Bitmap.SaveToStream(ms);
ms.Position:= 0;
// Добавляем длину данных, чтобы клиент знал, сколько данных будет передано
// Добавляем #0 , чтобы можно было определить, где заканчивается информация о размере.
Socket.SendText(IntToStr(ms.Size) + #0);
// Посылаем его.
Socket.SendStream(ms);
except
// Итак, осталось освободить поток, если что-то не так.
ms.Free;
( Sender: TObject)
Вот тебе прием и отправка на базе TClientSocket и TServerSocket из палитры Internet (D6).

procedure TForm1.FormCreate(Sender: TObject);
begin
// Открытие ОТПРАВЛЯЮЩЕГО (SENDING) сокета.
ServerSocket1.Active:= true;
end;

procedure TForm1.ClientSocket1Connect(Sender: TObject;
Socket: TCustomWinSocket);
begin
// Посылаем команду для начала передачи файла.
Socket.SendText("send");
end;

procedure TForm1.ClientSocket1Read(Sender: TObject;
Socket: TCustomWinSocket);
var
s, sl: string;
begin
s:= Socket.ReceiveText;
// Если мы не в режиме приёма данных а в режиме приема заголовка:
if not Reciving then
begin
// получаем длину потока данных.
SetLength(sl, StrLen(PChar(s))+1); // +1 для метки конца служебных данных
StrLCopy(@sl[1], PChar(s), Length(sl)-1);
DataSize:= StrToInt(sl);
Data:= TMemoryStream.Create;
// Удаляем информацию о размере из данных.
Delete(s, 1, Length(sl));
Reciving:= true;
end;
// Сохраняем данные в поток, до тех пор, пока не получим все данные.
try
Data.Write(s[1], length(s));
if Data.Size = DataSize then
begin
Data.Position:= 0;
Image2.Picture.Bitmap.LoadFromStream(Data);
Data.Free;
Reciving:= false;
Socket.Close;
end;
except
Data.Free;
end;
end;

procedure TForm1.ServerSocket1ClientRead(Sender: TObject;
Socket: TCustomWinSocket);
var
ms: TMemoryStream;
begin
// Клиент получает команду на передачу файла.
if Socket.ReceiveText = "send" then
begin
ms:= TMemoryStream.Create;
try
// Получаем данные на передачу.
// Здесь я поставил картинку, можно использовать и скриншот экрана
Image1.Picture.Bitmap.SaveToStream(ms);
ms.Position:= 0;
// Добавляем длину данных, чтобы клиент знал, сколько данных будет передано
// Добавляем #0 , чтобы можно было определить, где заканчивается информация о размере.
Socket.SendText(IntToStr(ms.Size) + #0);
// Посылаем его.
Socket.SendStream(ms);
except
// Итак, осталось освободить поток, если что-то не так.
ms.Free;
end;
end;
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
ClientSocket1.Active:= true;
end;


А для BitBlt создавай сначала временный TBitmap и копируй в него.
Например:
TmpBitmap := TBitmap.Create;
BitBlt(TmpBitmap.Canvas.Handle, ....);
Не забывай про освобождение его.

Желаю успехов


 
mOOx   (2003-08-08 13:07) [15]

Комментарии: так-то вроде все не плохо, только вот данные ты не в том направлении передал :). Это 1. Как передавать данные между сокетами я знаю. Это 2. Вопрос: TBitmap - только ради метода SaveToStream? Это 3. И наконец 4: так значит всетаки если я нарисую на TBitmap этим методом (с помощью BitBlt или StretchBlt), то данные все равно будут доступны через свойства объекта?


 
Rouse_ ©   (2003-08-08 13:14) [16]

1. По логике программы переданы правильно, клиент спрашивает, сервер посылает.
2. Опустим
3. См. пункт 4.
4. Да, данные будут доступны + все операции с изменением картинки будут совершаться намного быстрее. Если не понятно, см. пункт 3 :)

Желаю успехов


 
mOOx   (2003-08-08 13:32) [17]

К п.1: мне надо как раз наоборот - сервер просит, клиент исполняет и отсылает. Большое списибо за помощь, сколько всетаки можно узнать за одни сутки :).



Страницы: 1 вся ветка

Текущий архив: 2003.08.21;
Скачать: CL | DM;

Наверх




Память: 0.51 MB
Время: 0.014 c
3-68194
Magic&Wizard
2003-07-28 11:58
2003.08.21
API InterBase и FireBird


14-68450
MalkoLinge
2003-08-04 13:32
2003.08.21
Вот башни, которые грохнул Буш


1-68265
seregin
2003-08-07 08:30
2003.08.21
Замена Firebird на Yaffil


8-68418
RAA
2003-04-15 09:10
2003.08.21
BMP -> GIF ???


1-68406
The X
2003-08-07 13:28
2003.08.21
Случайное перемешивание данных 1-мерного массива