Делаем скриншот
| |
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 |
|
| |
|