Текущий архив: 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