Вверх ↑
Этот топик читают: Гость
Ответов: 256
Рейтинг: 15
#1: 2022-09-21 09:49:32 ЛС | профиль | цитата
Компонент Monitors не корректно снимает скриншоты с мониторов или со всего виртуального дисплея если один из мониторов, по отношении к основному, расположен с минусовыми координатами. Глюк проявляется точно на Windows 10 и 11. На Windows 7 не проверялось.

На видео хорошо видно как это происходит.
Видео

Схема, которой снимались скриншоты


Add(MainForm,2953706,140,63)
{
Width=462
Height=314
link(onCreate,6123934:doData,[])
}
Add(Monitors,3343536,259,168)
{
WorkArea=0
link(onScreenShot,16676156:doLoad,[])
link(Monitor,3242337:GetData,[])
}
Add(Image,16676156,315,168)
{
Left=85
Top=5
Width=355
Height=265
}
Add(Button,13264813,203,168)
{
Left=5
Top=35
Width=70
link(onClick,3343536:doScreenShotMonitor,[])
}
Add(ComboBox,6074985,301,49)
{
Left=5
Top=10
Width=70
Height=21
Strings=#4:Весь|1:0|1:1|
Text="0"
Point(Index)
Point(doSelect)
}
Add(DoData,6123934,203,77)
{
Data=Integer(0)
link(onEventData,6074985:doSelect,[])
}
Add(EventFromData,3242337,259,119)
{
link(onEvent,10367403:doOperation,[])
}
Add(Math,10367403,315,119)
{
OpType=1
Op2=1
link(onResult,3242337:doData,[(359,125)(359,113)(247,113)(247,125)])
link(Op1,6074985:Index,[])
}


Может кто нибудь исправить компонент?
карма: 3

0
vip
#1.1контекстная реклама от партнеров
Ответов: 2077
Рейтинг: 659
#2: 2022-09-21 18:25:05 ЛС | профиль | цитата
fox-video, а при свойстве WorkArea=false тот же результат?
карма: 10

0
Ответов: 256
Рейтинг: 15
#3: 2022-09-21 18:59:29 ЛС | профиль | цитата
sla8a писал(а):
при свойстве WorkArea=false тот же результат?

Абсолютно то же самое
карма: 3

0
Ответов: 2077
Рейтинг: 659
#4: 2022-09-21 19:39:29 ЛС | профиль | цитата
fox-video, а вставьте в код элемента следующую строчку и сообщите какое значение будет при отрицательно положении:
  if i <> -1 then
begin
M := TMonitor(FMonitors.Items[i]);
if _prop_WorkArea then
begin
_debug(M.GetWorkRect.Top);//вот эту строчку добавьте в 278 строку

Редактировалось 1 раз(а), последний 2022-09-21 19:39:36
карма: 10

0
Ответов: 256
Рейтинг: 15
#5: 2022-09-22 08:07:07 ЛС | профиль | цитата
sla8a писал(а):
какое значение будет при отрицательно положении

Отрицательное

Не работает при любой отрицательной координате
Видео
Схема


Add(MainForm,15905099,63,133)
{
Width=625
Height=425
link(onCreate,8590651:doEvent1,[(114,153)(114,202)])
}
Add(Image,16676156,280,126)
{
Left=10
Top=10
Width=355
Height=215
}
Add(Image,16135924,287,259)
{
Left=375
Top=5
Width=220
Height=295
}
Add(Label,2284981,56,35)
{
Left=10
Top=245
Width=114
Height=17
Caption="Монитор 2 (основной)"
}
Add(Label,9249725,189,35)
{
Left=385
Top=310
Width=57
Height=17
Caption="Монитор 1"
}
Add(Button,11183933,63,203)
{
Left=15
Top=355
link(onClick,8590651:doEvent2,[])
}
Add(Monitors,3343536,280,196)
{
Monitor=1
WorkArea=0
Point(doMonitorParametrs)
Point(onParametrs)
link(onScreenShot,16676156:doLoad,[(324,202)(324,167)(268,167)(268,132)])
link(onParametrs,16772897:doSeparateMT,[])
}
Add(Monitors,5260127,287,322)
{
WorkArea=0
Point(doMonitorParametrs)
Point(onParametrs)
link(onScreenShot,16135924:doLoad,[(331,328)(331,296)(275,296)(275,265)])
link(onParametrs,6514158:doSeparateMT,[])
}
Add(Hub,8590651,133,196)
{
InCount=2
OutCount=4
link(onEvent1,3343536:doScreenShotMonitor,[])
link(onEvent2,3343536:doMonitorParametrs,[])
link(onEvent3,5260127:doScreenShotMonitor,[(206,216)(206,328)])
link(onEvent4,5260127:doMonitorParametrs,[(193,223)(193,335)])
}
Add(Label,10606733,98,35)
{
Left=10
Top=270
Width=21
Height=17
Caption="left:"
}
Add(Label,11078458,140,35)
{
Left=10
Top=295
Width=22
Height=17
Caption="top:"
}
Add(Label,2245378,434,203)
{
Left=35
Top=270
}
Add(Label,6688219,434,245)
{
Left=35
Top=295
}
Add(Label,7866723,231,35)
{
Left=385
Top=340
Width=21
Height=17
Caption="left:"
}
Add(Label,7598663,273,35)
{
Left=385
Top=365
Width=22
Height=17
Caption="top:"
}
Add(Label,6292641,434,329)
{
Left=410
Top=340
}
Add(Label,2657749,434,371)
{
Left=410
Top=365
}
Add(MT_MultiData,16772897,357,203)
{
link(onData1,2245378:doText,[])
link(onData2,6688219:doText,[(411,216)(411,251)])
}
Add(MT_MultiData,6514158,357,329)
{
link(onData1,6292641:doText,[])
link(onData2,2657749:doText,[(411,342)(411,377)])
}
карма: 3

0
Ответов: 2077
Рейтинг: 659
#6: 2022-09-22 09:14:36 ЛС | профиль | цитата
fox-video, а добавьте эту строку:
function TMonitor.GetWorkRect: TRect;
var
MonInfo: TMonitorInfoEx;
begin
MonInfo.cbSize := SizeOf(MonInfo);
GetMonitorInfo(FHandle, @MonInfo);
OffsetRect(MonInfo.rcWork,MonInfo.rcWork.Left * -1, MonInfo.rcWork.Top * -1);//Test
Result := MonInfo.rcWork;
end;

Редактировалось 1 раз(а), последний 2022-09-22 09:25:20
карма: 10

0
Ответов: 256
Рейтинг: 15
#7: 2022-09-22 09:33:49 ЛС | профиль | цитата
sla8a писал(а):
а добавьте эту строку:


Снимается скрин с основного монитора


карма: 3

0
Ответов: 2077
Рейтинг: 659
#8: 2022-09-23 18:07:29 ЛС | профиль | цитата
fox-video, не смогу помочь, так как нет возможности протестировать. Может кто другой возьмется или хорошо если автор объявиться (надеюсь что это произойдет).
карма: 10

0
Ответов: 256
Рейтинг: 15
#9: 2022-09-24 15:38:34 ЛС | профиль | цитата
sla8a писал(а):
Может кто другой возьмется

Был уверен, что andrestudio мимо темы не пройдет, но увы.
карма: 3

0
Ответов: 5147
Рейтинг: 578
#10: 2022-09-25 14:43:26 ЛС | профиль | цитата
В связи с расширением ОЗУ в 32 битной системе внешняя видео-карта отказалась работать. Так что увы, помочь не смогу.
карма: 5
0
Ответов: 256
Рейтинг: 15
#11: 2022-09-25 15:38:57 ЛС | профиль | цитата
andrestudio писал(а):
Так что увы, помочь не смогу

Всё, конец песне...
карма: 3

0
Ответов: 5147
Рейтинг: 578
#12: 2022-09-25 17:35:22 ЛС | профиль | цитата
fox-video, безысходность может заключаться только в том что бы не пробовать исправить это самостоятельно. Не всё в руках божьих.
карма: 5
0
Ответов: 256
Рейтинг: 15
#13: 2022-09-27 11:50:30 ЛС | профиль | цитата
andrestudio писал(а):
fox-video, безысходность может заключаться только в том что бы не пробовать исправить это самостоятельно. Не всё в руках божьих.

Код писать не умею, потому и выбрал HiAsm для разработок простых утилит\приложений.

Попробовал разобраться сам... и получилось! Нужно изменить строки 271, 279 и 284

procedure THiMonitors._work_doScreenShotMonitor;
var
M: TMonitor;
i: integer;
DC: HDC;
bmp, tmp: PBitmap;
begin
i := ReadInteger(_Data, _data_Monitor, _prop_Monitor);
if (i < -1) or (i > FMonitors.Count - 1) then exit;
DC := GetDC(0);
tmp := NewBitmap(GetSystemMetrics(SM_CXVIRTUALSCREEN), GetSystemMetrics(SM_CYVIRTUALSCREEN));
BitBlt(tmp.Canvas.Handle, 0, 0, tmp.Width, tmp.Height, DC, (GetSystemMetrics(SM_XVIRTUALSCREEN)), (GetSystemMetrics(SM_YVIRTUALSCREEN)), SrcCopy);

if i <> -1 then
begin
M := TMonitor(FMonitors.Items[i]);
if _prop_WorkArea then
begin
bmp := NewBitmap(M.GetWorkWidth, M.GetWorkHeight);
BitBlt(bmp.Canvas.Handle, 0, 0, bmp.Width, bmp.Height, DC, (M.GetWorkRect.Left), (M.GetWorkRect.Top), SrcCopy);
end
else
begin
bmp := NewBitmap(M.GetWidth, M.GetHeight);
BitBlt(bmp.Canvas.Handle, 0, 0, bmp.Width, bmp.Height, DC, (M.GetWorkRect.Left), (M.GetWorkRect.Top), SrcCopy);
end;
_hi_onEvent(_event_onScreenShot, bmp);
bmp.free;
end
else
_hi_onEvent(_event_onScreenShot, tmp);

ReleaseDC(0, DC);
tmp.free;
end;

Схема для тестирования

Add(MainForm,2953706,42,49)
{
Width=728
Height=397
}
Add(Monitors,4460692,210,56)
{
Point(doWorkArea)
link(onScreenShot,6864150:doLoad,[])
}
Add(Button,3603329,91,49)
{
Left=15
Top=5
Caption="Весь"
Data=Integer(-1)
link(onClick,10004233:doEvent1,[])
}
Add(Image,6864150,273,56)
{
Left=90
Top=5
Width=610
Height=345
}
Add(Hub,10004233,161,49)
{
InCount=3
link(onEvent1,6864150:doClear,[(256,55)(256,69)])
link(onEvent2,4460692:doScreenShotMonitor,[])
}
Add(Button,8386685,91,91)
{
Left=15
Top=35
Caption="1"
Data=Integer(0)
link(onClick,10004233:doEvent2,[(142,97)(142,62)])
}
Add(Button,699764,91,133)
{
Left=15
Top=65
Caption="2"
Data=Integer(1)
link(onClick,10004233:doEvent3,[(142,139)(142,69)])
}
Add(CheckBox,12037815,91,175)
{
Left=5
Top=95
Width=70
Caption="WorkArea"
link(onCheck,4460692:doWorkArea,[(187,181)(187,69)])
}
карма: 3

0
Ответов: 5147
Рейтинг: 578
#14: 2022-09-27 16:50:16 ЛС | профиль | цитата
Вот видишь, не Боги горшки обжигают. Главное иметь цель, решение всегда найдётся.
карма: 5
0
14
Сообщение
...
Прикрепленные файлы
(файлы не залиты)