Делаем скриншот
|
xXxSh@dowxXx
|
Дата: Вторник, 06.03.2012, 13:54 | Сообщение # 1
|
Авторитетный
Зарегистрирован: 22.01.2012
Группа: Модераторы
Сообщений: 702
Статус: Offline
|
Всем привет, это снова я 
у меня такой вопрос:
пишу программу запись изображения с экрана монитора, и не могу разобраться как добавить в программу выделение определенной области экрана мышкой, что бы запись производилась конкретно из этой выделенной области?
сам код записи и сохранения видео у меня уже есть, и с этим я разобрался, просто в моем коде я изначально указывал "height" и "width" в диапозоне которых и производилась запись, мне нужно добавить возможность выделения области экрана, что бы параметры высоты и ширины выделенной области копировались в программу, вот как то так...
вобщем как я понял нужно во первых нарисовать поверх всех окон (при нажатии на Mouse1) рамку, что бы пользователь видел какую конкретно область он выделил..,далее нужно плясать по высоте и ширине от края экрана, для того что бы контуры рамки можно было увеличивать либо уменьшать - как при обычном выделении, но как это все выглядит в коде я не могу никак сообразить, подскажите кто в курсе как это должно быть или какие хоть функции использовать?
Сообщение отредактировал xXxSh@dowxXx - Вторник, 06.03.2012, 13:57
|
|
|
|
|
GReIIIHuK
|
Дата: Вторник, 06.03.2012, 14:04 | Сообщение # 2
|
Участник
Зарегистрирован: 15.05.2011
Группа: Пользователи
Сообщений: 98
Статус: Offline
|
Если не секрет, каким способом ты пользуешься для записи видео?
Skype:"greiiihuk."


Да, я преступник. Мое преступление — любопытство.
Быть может умру я, умрут многие, но идея останется жить навсегда.
Я работаю не только за спасибо.(+) ©
|
|
|
|
|
xXxSh@dowxXx
|
Дата: Вторник, 06.03.2012, 14:32 | Сообщение # 3
|
Авторитетный
Зарегистрирован: 22.01.2012
Группа: Модераторы
Сообщений: 702
Статус: Offline
|
я перепробовал несколько способов, есть также множество компонентов для этого, но больше всего мне понравились компоненты с этого сайта www.mitov.com у них очень даже неплохие и качественные компоненты для разработки множества разнообразных продуктов, тем более их компоненты поддерживают очень даже неплохой показатель FPS в работе, их я и использовал в своей программе...
Сообщение отредактировал xXxSh@dowxXx - Вторник, 06.03.2012, 14:33
|
|
|
|
|
xXxSh@dowxXx
|
Дата: Вторник, 06.03.2012, 15:16 | Сообщение # 4
|
Авторитетный
Зарегистрирован: 22.01.2012
Группа: Модераторы
Сообщений: 702
Статус: Offline
|
если я не ошибаюсь то вроде как нудно использовать функцию "DrawFocusRect" ?
у кого нибудь есть исходник или кто может хотя бы примерно код представить?
ребят помогите пожалуйста, это в принципе последнее чего так не хватает в программе...
нашел вот такие куски кода:
Code
var DC:HDC;
bm:TBitMap;
...
bm:=TBitMap.Create;
DC:=GetDC(0); // получишь DC экрана
// при сохранении куска раб. стола
...
bm.width:=w;
bm.height:=h; // ширина и высота копируемой области
bitblt(bm.canvas.handle,0,0,w-1,h-1,DC,x,y,SRCCOPY); // копировать в BM кусок из DC WxH
...
//При загрузке
bitblt(DC,x,y,w-1,h-1,bm.canvas.handle,0,0,SRCCOPY) // копировать на экран
и рисование линий на DC:
Code
windows.MoveToEx(DC,x,y,nil);
windows.LineTo(DC,x+w-1,y+h-1);
но их же нада как то раскидать по MouseDown/MouseMove/MouseUp...
я примерно понимаю как все должно работать, но блин в коде не могу это описать 
Сообщение отредактировал xXxSh@dowxXx - Вторник, 06.03.2012, 16:43
|
|
|
|
|
xXxSh@dowxXx
|
Дата: Среда, 07.03.2012, 23:31 | Сообщение # 5
|
Авторитетный
Зарегистрирован: 22.01.2012
Группа: Модераторы
Сообщений: 702
Статус: Offline
|
нашел вот такой вот код:
"Собственно программа работает следующим образом - с первой формы нажатием кнопки вызывается вторая. Вторая форма Alphablend=100, borderstyle:= none, align:= allclient. По нажатию кнопки мыша начинается рисование Canvas.Rectangle, по отпусканию кнопки - рисование прекращается, область прямоугольника сохраняется в файл"
Code
procedure TForm2.FormMouseDown(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
begin
pos1 := Point(X, Y);
risuem := true;
Form2.AlphaBlendValue := 80;
end;
procedure TForm2.FormMouseUp(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
var
ScreenDC:HDC;
Canvas:TCanvas;
myjpg: TJPEGImage;
Image: TImage;
begin
pos2 := Point(X, Y);
risuem := false;
Form2.AlphaBlendValue := 1;
Image:=TImage.Create(nil);
myjpg:= TJPEGImage.Create;
ScreenDC := GetDC(0);
Canvas:=TCanvas.Create();
Canvas.Handle:=ScreenDC;
Image.Width := pos2.X - pos1.X;
Image.Height := pos2.y - pos1.y;
Image.Canvas.CopyRect(Rect(0,0,Image.Width,Image.Height), Canvas, Rect(pos1, pos2));
ReleaseDC(0,ScreenDC);
myjpg.Assign(Image.Picture.Bitmap);
myjpg.compressionquality:=100;
myjpg.compress;
myjpg.SaveToFile('prob.jpg');
Image.Free;
Canvas.Free;
close;
end;
procedure TForm2.FormMouseMove(Sender: TObject; Shift: TShiftState; X,
Y: Integer);
begin
if risuem = true then
begin
Form2.Canvas.Pen.Color := clNone;
Form2.Canvas.Brush.Color := clBtnFace;
Form2.Canvas.Rectangle(0,0,Form2.Width, Form2.Height);
Form2.Canvas.Pen.Color := clred;
Form2.Canvas.Brush.Color := clBlack;
Form2.Canvas.Rectangle(Classes.Rect(pos1, Point(x, y)));
pos3 := Point(X, Y);
end;
end;
procedure TForm2.FormCreate(Sender: TObject);
begin
Form2.Canvas.Pen.Color := clred;
Form2.Canvas.Brush.Color := clBlack;
end;
end.
подскажите в чем ошибка?
я так понял что неизвестна переменные pos1;pos2;pos3;risuem
но как их объявить?
то что выдает компилятор я выложил в скрине...
и выложу еще исходник на всякий случай, ни как не могу сообразить, вроде такая фигня, ночью вобще голова не варит совсем
Сообщение отредактировал xXxSh@dowxXx - Четверг, 08.03.2012, 11:53
|
|
|
|
|
XSPY
|
Дата: Четверг, 08.03.2012, 17:14 | Сообщение # 6
|
Продвинутый
Зарегистрирован: 28.01.2010
Группа: Пользователи
Сообщений: 263
Статус: Offline
|
пля..поройтесь в сорсах бэкдоров и стиллеров-там куча такого..
Я не крекер,а программист!
Я не преступник-я свободный человек!
Лучше один раз накодить,чем сто раз качать билды!
|
|
|
|
|
xXxSh@dowxXx
|
Дата: Четверг, 08.03.2012, 17:28 | Сообщение # 7
|
Авторитетный
Зарегистрирован: 22.01.2012
Группа: Модераторы
Сообщений: 702
Статус: Offline
|
А зачем собственно спрашивается такие функции бэкдорам нужны? 
я вобще вполне обычную и полезную программу пишу, при чем тут бэкдоры...?
если вы имеете ввиду что бэкдоры делают обычный скриншот экрана, и сохраняют его для отправки то это вобще ерунда и код там до нельзя прост, да и это вобще не то, у меня то более глобальные задачи!!!
Сообщение отредактировал xXxSh@dowxXx - Четверг, 08.03.2012, 17:32
|
|
|
|
|
Neo
|
Дата: Пятница, 09.03.2012, 06:06 | Сообщение # 8
|
Модератор
Зарегистрирован: 04.05.2010
Группа: Модераторы
Сообщений: 317
Статус: Offline
|
Держи исправленный вариант
|
|
|
|
|
xXxSh@dowxXx
|
Дата: Пятница, 09.03.2012, 11:53 | Сообщение # 9
|
Авторитетный
Зарегистрирован: 22.01.2012
Группа: Модераторы
Сообщений: 702
Статус: Offline
|
Quote (Neo)
Держи исправленный вариант
странно у меня все равно ту же самую ошибку выдает при компиляции, и я так и не нашел что ты изменил что бы скомпилировать?
может быть ты не тот проект в архив залил? не ну серьезно хз почему та же самая ошибка...
ок хорошо с pos1,2,3 я разобрался, а risuem это что вобще?
Сообщение отредактировал xXxSh@dowxXx - Пятница, 09.03.2012, 12:16
|
|
|
|
|
Neo
|
Дата: Пятница, 09.03.2012, 12:22 | Сообщение # 10
|
Модератор
Зарегистрирован: 04.05.2010
Группа: Модераторы
Сообщений: 317
Статус: Offline
|
Извени,я забыл нажать Ctrl+S)))).Вот точно исправленный!
А вообще надо было так сделать:
Объявить
pos1,pos2,pos3:TPoint;
risuem:boolean;
и добавить в uses jpeg модель,для работы с типом TJPEGImage;
Это всё)
Сообщение отредактировал Neo - Пятница, 09.03.2012, 12:54
|
|
|
|
|
xXxSh@dowxXx
|
Дата: Пятница, 09.03.2012, 12:26 | Сообщение # 11
|
Авторитетный
Зарегистрирован: 22.01.2012
Группа: Модераторы
Сообщений: 702
Статус: Offline
|
УРА! проблема решена, наконец то 
ОГРОМНОЕ СПАСИБО! Neo
Сообщение отредактировал xXxSh@dowxXx - Пятница, 09.03.2012, 12:26
|
|
|
|
|
xXxSh@dowxXx
|
Дата: Пятница, 09.03.2012, 17:13 | Сообщение # 12
|
Авторитетный
Зарегистрирован: 22.01.2012
Группа: Модераторы
Сообщений: 702
Статус: Offline
|
Такс...,рано я обрадовался 
возник еще один вопрос, как теперь в этом же примере получить значения "Top" и "Left" то есть от верхнего левого угла экрана до точки где происходит событие "FormMouseDown" ?
за помощь с меня +++
Сообщение отредактировал xXxSh@dowxXx - Пятница, 09.03.2012, 17:15
|
|
|
|
|
XSPY
|
Дата: Пятница, 09.03.2012, 17:25 | Сообщение # 13
|
Продвинутый
Зарегистрирован: 28.01.2010
Группа: Пользователи
Сообщений: 263
Статус: Offline
|
xXxSh@dowxXx, в хороших бекдорах поверьте,это есть и оно нужно))
просто получите значение от FormMouseDown-у Архангельсоко описано вроде...
Также поищи сорс(в инете был и у меня дето,но у меня не помню где),он при запуске и движении мышы он показывает координаты.Думаю тебе поможет)) 
Я не крекер,а программист!
Я не преступник-я свободный человек!
Лучше один раз накодить,чем сто раз качать билды!
|
|
|
|
|
xXxSh@dowxXx
|
Дата: Пятница, 09.03.2012, 17:48 | Сообщение # 14
|
Авторитетный
Зарегистрирован: 22.01.2012
Группа: Модераторы
Сообщений: 702
Статус: Offline
|
Благодарю, уже нашел, вот кому нибудь может пригодится:
Code
procedure TForm1.Button1Click(Sender: TObject);
var
foo: TPoint;
begin
GetCursorPos(foo);
Edit1.Text:=(IntToStr(foo.Y));
Edit2.Text:=(IntToStr( foo.X));
end;
Сообщение отредактировал xXxSh@dowxXx - Пятница, 09.03.2012, 17:48
|
|
|
|
|