Вверх ↑
Этот топик читают: Гость
Ответов: 17
Рейтинг: 0
#1: 2017-03-27 06:41:57 ЛС | профиль | цитата
Стандартный компонент ScreenShort делает снимок экрана с одного монитора. Если установлено два и более мониторов, то снимок делается только с основного (первого) монитора.
Каким образом можно получить снимок со всех мониторов?
карма: 0

0
vip
#1.1контекстная реклама от партнеров
Ответов: 8886
Рейтинг: 823
#2: 2017-03-27 11:23:31 ЛС | профиль | цитата
rav, эмулировать нажатие PrintScreen (у меня код клавиши 44)
схема


Add(MainForm,2953706,161,98)
{
Width=421
Point(onKeyUp)
Point(onKeyDown)
Point(Handle)
}
Add(Button,640836,112,189)
{
Left=10
Top=20
link(onClick,1033418:doPress,[])
}
Add(Image,4532416,280,126)
{
Left=15
Top=45
Width=375
Height=210
}
Add(ClipboardHook,1780961,224,119)
{
link(onBitmap,4532416:doLoad,[])
}
Add(KeyEvent,1033418,161,189)
{
link(Handle,2953706:Handle,[])
link(Code,8804790:Value,[(174,180)(181,180)])
}
Add(Memory,8804790,175,140)
{
Default=Integer(44)
}

2_экрана_44.jpg
карма: 19

0
Ответов: 17
Рейтинг: 0
#3: 2017-03-28 06:54:06 ЛС | профиль | цитата
Способ работающий но имеет ряд неудобств....
Может есть способ указать компоненту "ScreenShort" идентификатор многооконности.
карма: 0

0
Ответов: 8886
Рейтинг: 823
#4: 2017-03-28 10:50:47 ЛС | профиль | цитата
rav, какие неудобства?
У нас есть компонент перечисляющий свойства всяких девайсов, в т. ч. мониторов с указанием ID. (в схеме поставил маску по "*монитор*", её можно убрать/изменить, если имя не на русском). Но этот ID не Handle, и не работает
Может коллеги помогут nesco, ау!
схема


Add(MainForm,11744559,266,91)
{
Width=421
Height=472
Point(onKeyUp)
Point(onKeyDown)
Point(Handle)
}
Add(Button,640836,182,182)
{
Left=15
Top=10
link(onClick,7266898:doEvent1,[])
}
Add(Image,4532416,329,224)
{
Left=15
Top=45
Width=375
Height=130
link(Bitmap,4481805:Bitmap,[])
}
Add(KeyEvent,1033418,266,182)
{
link(Handle,11744559:Handle,[])
link(Code,8804790:Value,[(279,173)(286,173)])
}
Add(Memory,8804790,280,133)
{
Default=Integer(44)
}
Add(DeviceInfo,16639638,252,301)
{
link(onEnumDevice,4665706:doStr,[])
}
Add(Clipboard,4481805,322,182)
{
}
Add(Hub,7266898,224,182)
{
link(onEvent1,1033418:doPress,[])
link(onEvent2,4532416:doLoad,[(256,195)(256,230)])
}
Add(Button,9667439,175,294)
{
Left=5
Top=185
link(onClick,10963707:doEvent1,[])
}
Add(Hub,10963707,217,294)
{
link(onEvent1,3220611:doClear,[])
link(onEvent2,16639638:doEnumDevice,[])
}
Add(MT_String,4665706,301,301)
{
link(onResult,11777046:doCompare,[])
}
Add(StrMask,11777046,350,301)
{
Mask="*монитор*"
link(onTrue,3220611:doAdd,[(389,314)(389,293)])
}
Add(ScreenShort,1272899,427,399)
{
link(onCapture,2228111:doLoad,[])
link(Handle,13316301:Part2,[])
}
Add(StringTable,3220611,413,287)
{
Left=5
Top=210
Width=385
Height=95
Columns=#7:P_ID=50|5:ID=50|10:IconIdx=50|8:Name=100|12:DeviceIdx=80|12:ClassGUID=80|14:ConfigFlags=80|
Grid=0
link(onClick,13316301:doSplit,[(452,293)(452,328)(403,328)(403,342)])
}
Add(MultiStrPart,13316301,420,336)
{
Count=7
link(onSplit,1272899:doCapture,[(480,342)(480,377)(417,377)(417,405)])
link(Str,3220611:Select,[])
}
Add(Image,2228111,476,399)
{
Left=15
Top=320
Width=380
Height=110
}

карма: 19

0
Разработчик
Ответов: 26061
Рейтинг: 2120
#5: 2017-03-28 12:33:11 ЛС | профиль | цитата
Леонид писал(а):
Но этот ID не Handle, и не работает

И не должно работать -- ID устройства не есть дескриптор окна

--- Добавлено в 2017-03-28 13:06:38

Леонид, если у тебя несколько мониторов, то попробуй вот этот метод заменить на мой в компоненте ScreenShort. К сожалению, я не могу проверить, у меня тупо нет нескольких мониторов. Если это работает, то я обновлю компонент.

procedure THIScreenShort._work_doCapture;
const
SM_CXVIRTUALSCREEN = 78;
SM_CYVIRTUALSCREEN = 79;
var wnd:HWND;
dc:HDC;
Bmp:PBitmap;
r:TRect;
rgn: HRGN;
RgnDword: DWORD;
RgnData: PRgnData;

function SWidth: integer;
begin
Result := GetSystemMetrics( SM_CXVIRTUALSCREEN );
end;

function SHeight: integer;
begin
Result := GetSystemMetrics( SM_CYVIRTUALSCREEN );
end;

begin
wnd := ReadInteger(_data,_data_Handle,0);
if _prop_UseRegion then
begin
if wnd = 0 then dc := GetDC(0)
else dc := GetWindowDC(wnd);
rgn := CreateRectRgn(0, 0, 0, 0);
if 0 = CombineRgn(rgn, ReadInteger(_Data, _data_Region), 0, RGN_COPY) then Bmp := NewBitmap(0,0)
else
begin
RgnDword := GetRegionData(rgn, 0, nil);
GetMem(RgnData, SizeOf(RgnData) * RgnDword);
GetRegionData(rgn, RgnDword, RgnData);
r.Left := RgnData.rdh.rcBound.Left;
r.Top := RgnData.rdh.rcBound.Top;
r.Right := RgnData.rdh.rcBound.Right - r.Left;
r.Bottom := RgnData.rdh.rcBound.Bottom - r.Top;
FreeMem(RgnData);
Bmp := NewBitmap(r.Right,r.Bottom);
Bmp.BkColor := _prop_Color;
Bmp.Canvas.Brush.BrushStyle := bsSolid;
Bmp.Canvas.FillRect(Bmp.BoundsRect);
OffsetRgn(rgn, -r.Left, -r.Top);
SelectClipRGN(Bmp.Canvas.Handle, rgn);
BitBlt(Bmp.Canvas.Handle,0,0,Bmp.Width,Bmp.Height,dc,r.Left,r.Top,SRCCOPY);
DeleteObject(rgn);
end;
end
else
begin
if wnd = 0 then
begin
dc := GetDC(0);
// Bmp := NewBitmap(ScreenWidth,ScreenHeight);
Bmp := NewBitmap(SWidth,SHeight);
end
else
begin
dc := GetWindowDC(wnd);
GetWindowRect(wnd,r);
Bmp := NewBitmap(r.Right-r.Left,r.Bottom-r.Top);
end;
BitBlt(Bmp.Canvas.Handle,0,0,Bmp.Width,Bmp.Height,DC,0,0,SRCCOPY);
end;
_hi_OnEvent(_event_onCapture, bmp);
bmp.Free;
ReleaseDC(wnd,dc);
end;


Редактировалось 3 раз(а), последний 2017-03-28 13:08:33
карма: 22

0
Разработчик
Ответов: 26061
Рейтинг: 2120
#6: 2017-03-28 16:17:40 ЛС | профиль | цитата
У кого есть несколько мониторов, попробуйте вот эту схему, которая может получить параметры конкретного монитора и его скриншот

Схема

Add(MainForm,2953706,77,140)
{
Width=583
Height=561
Position=1
link(onCreate,9022255:doFor,[])
}
Add(InlineCode,10142460,175,98)
{
WorkPoints=#18:doMonitorParametrs|20:doScreenShortMonitor|
EventPoints=#11:onParametrs|13:onScreenShort|
VarPoints=#6:MCount|
Code=#15:unit HiAsmUnit;|0:|9:interface|0:|32:uses Windows, kol, Share, Debug;|0:|4:type|26: HMONITOR = type Integer;|0:|26: tagMONITORINFOA = record|18: cbSize: DWORD;|21: rcMonitor: TRect;|18: rcWork: TRect;|19: dwFlags: DWORD;|6: end;|35: tagMONITORINFO = tagMONITORINFOA;|33: MONITORINFOA = tagMONITORINFOA;|29: MONITORINFO = MONITORINFOA;|36: LPMONITORINFOA = ^tagMONITORINFOA;|33: LPMONITORINFO = LPMONITORINFOA;|34: PMonitorInfoA = ^tagMONITORINFO;|31: PMonitorInfo = PMonitorInfoA;|33: TMonitorInfoA = tagMONITORINFO;|31: TMonitorInfo = TMonitorInfoA;|0:|90:TMonitorEnumProc = function(hm: HMONITOR; dc: HDC; r: PRect; l: LPARAM): Boolean; stdcall;|0:|92:function GetMonitorInfo(hMonitor: HMONITOR; lpMonitorInfo: PMonitorInfoA): Boolean; stdcall;|54: external 'USER32.DLL' name 'GetMonitorInfoA';|0:|92:function EnumDisplayMonitors(hdc: HDC; lprcIntersect: PRect; lpfnEnumProc: TMonitorEnumProc;|92: lData: LPARAM): Boolean; stdcall; external 'USER32.DLL' name 'EnumDisplayMonitors';|4: |0:|4:type|19: TMonitor = class;|22: PMonitor = TMonitor;|26: TMonitor = class(TDebug)|9: private|22: FHandle: HMONITOR;|25: FMonitorNum: Integer;|30: function GetLeft: Integer;|32: function GetHeight: Integer;|29: function GetTop: Integer;|31: function GetWidth: Integer;|28: function GetRect: TRect;|8: public|43: property Handle: HMONITOR read FHandle;|50: property MonitorNum: Integer read FMonitorNum;|40: property Left: Integer read GetLeft;|44: property Height: Integer read GetHeight;|38: property Top: Integer read GetTop;|42: property Width: Integer read GetWidth;|38: property Rect: TRect read GetRect;|6: end;|0:|4:type|28: THiAsmClass = class(TDebug)|10: private|21: FMonitors: PList;|9: public|29: onScreenShort: THI_Event;|27: onParametrs: THI_Event;|23: constructor Create;|33: destructor Destroy; override;|62: procedure doScreenShortMonitor(var _Data:TData; idx:word);|60: procedure doMonitorParametrs(var _Data:TData; idx:word);|48: procedure MCount(var _Data:TData; idx:word);|5: end;|0:|14:implementation|0:|35:function TMonitor.GetLeft: Integer;|3:var|24: MonInfo: TMonitorInfo;|5:begin|36: MonInfo.cbSize := SizeOf(MonInfo);|36: GetMonitorInfo(FHandle, @MonInfo);|35: Result := MonInfo.rcMonitor.Left;|4:end;|0:|37:function TMonitor.GetHeight: Integer;|3:var|24: MonInfo: TMonitorInfo;|5:begin|36: MonInfo.cbSize := SizeOf(MonInfo);|36: GetMonitorInfo(FHandle, @MonInfo);|61: Result := MonInfo.rcMonitor.Bottom - MonInfo.rcMonitor.Top;|4:end;|0:|34:function TMonitor.GetTop: Integer;|3:var|24: MonInfo: TMonitorInfo;|5:begin|36: MonInfo.cbSize := SizeOf(MonInfo);|36: GetMonitorInfo(FHandle, @MonInfo);|34: Result := MonInfo.rcMonitor.Top;|4:end;|0:|36:function TMonitor.GetWidth: Integer;|3:var|24: MonInfo: TMonitorInfo;|5:begin|36: MonInfo.cbSize := SizeOf(MonInfo);|36: GetMonitorInfo(FHandle, @MonInfo);|61: Result := MonInfo.rcMonitor.Right - MonInfo.rcMonitor.Left;|4:end;|0:|33:function TMonitor.GetRect: TRect;|3:var|24: MonInfo: TMonitorInfo;|5:begin|36: MonInfo.cbSize := SizeOf(MonInfo);|36: GetMonitorInfo(FHandle, @MonInfo);|30: Result := MonInfo.rcMonitor;|4:end;|0:|80://------------------------------------------------------------------------------|0:|92:function EnumMonitorsProc(hm: HMONITOR; dc: HDC; r: PRect; Data: Pointer): Boolean; stdcall;|3:var|11: L: PList;|14: M: TMonitor;|5:begin|19: L := PList(Data);|23: M := TMonitor.Create;|18: M.FHandle := hm;|27: M.FMonitorNum := L.Count;|11: L.Add(M);|17: Result := True;|4:end;|0:|31:constructor THiAsmClass.Create;|5:begin|12: inherited;|23: FMonitors := NewList;|69: EnumDisplayMonitors(0, nil, @EnumMonitorsProc, LongInt(FMonitors));|6:end; |0:|31:destructor THiAsmClass.Destroy;|5:begin|17: FMonitors.free;|12: inherited;|4:end;|0:|41:procedure THiAsmClass.doMonitorParametrs;|3:var|12: dt: TData;|10: mt: PMT;|14: M: TMonitor;|13: i: integer;|5:begin|24: i := ToInteger(_Data);|52: if (i < 0) or (i > FMonitors.Count - 1) then exit;|36: M := TMonitor(FMonitors.Items[i]);|27: dtInteger(dt, M.GetLeft);|20: mt := mt_make(dt);|23: mt_int(mt, M.GetTop);|25: mt_int(mt, M.GetWidth);|26: mt_int(mt, M.GetHeight);|32: _hi_onEvent_(onParametrs, dt);|26: mt_free(mt); |4:end;|0:|43:procedure THiAsmClass.doScreenShortMonitor;|5:const|26: SM_CXVIRTUALSCREEN = 78;|26: SM_CYVIRTUALSCREEN = 79;|3:var|14: M: TMonitor;|13: i: integer;|10: dc: HDC;|20: bmp, tmp: PBitmap;|2: |27: function SWidth: integer;|7: begin|57: Result := GetSystemMetrics( SM_CXVIRTUALSCREEN ); |6: end;|0:|28: function SHeight: integer;|7: begin|59: Result := GetSystemMetrics( SM_CYVIRTUALSCREEN ); |6: end;|0:|5:begin|24: i := ToInteger(_Data);|52: if (i < 0) or (i > FMonitors.Count - 1) then exit;|36: M := TMonitor(FMonitors.Items[i]);|44: bmp := NewBitmap(M.GetWidth, M.GetHeight);|0:|36: tmp := NewBitmap(SWidth, SHeight);|0:|17: DC := GetDC(0);|76: BitBlt(tmp.Canvas.Handle, 0, 0, tmp.Width, tmp.Height, DC, 0, 0, SRCCOPY);|19: ReleaseDC(0, DC);|63: bmp.Canvas.CopyRect(bmp.Canvas.ClipRect, tmp.Canvas, M.Rect);|0:|34: _hi_onEvent(onScreenShort, bmp);|0:|11: tmp.free;|11: bmp.free;|4:end;|0:|29:procedure THiAsmClass.MCount;|5:begin|36: dtInteger(_Data, FMonitors.Count);|4:end;|0:|4:end.|
link(onParametrs,5069644:doValue,[(214,104)(214,97)])
link(onScreenShort,330810:doLoad,[])
}
Add(Image,330810,266,105)
{
Left=15
Top=15
Width=540
Height=425
}
Add(ComboBox,11548193,266,154)
{
Left=45
Top=460
Width=90
Height=21
ReadOnly=0
}
Add(Button,12865432,168,217)
{
Left=230
Top=495
Width=100
TabOrder=-1
Caption="GetSceenShort"
link(onClick,16503412:doData,[])
}
Add(For,9022255,168,154)
{
IncludeEnd=1
link(onEvent,11548193:doAdd,[])
link(End,10142460:MCount,[])
}
Add(DoData,16503412,273,217)
{
link(onEventData,14274399:doEvent1,[(312,223)(312,90)(130,90)(130,104)])
link(Data,11548193:String,[])
}
Add(Label,15382900,56,77)
{
Left=150
Top=465
Width=13
Height=17
Caption="L:"
}
Add(Edit,1472934,385,161)
{
Left=170
Top=460
Width=60
Text=""
link(onChange,2631098:doText,[])
link(Str,5069644:Value1,[])
}
Add(Label,10894502,63,84)
{
Left=245
Top=465
Width=14
Height=17
Caption="T:"
}
Add(Edit,2631098,434,161)
{
Left=265
Top=460
Width=60
Text=""
link(onChange,4264014:doText,[])
link(Str,5069644:Value2,[(440,152)(398,152)])
}
Add(Label,4425087,70,91)
{
Left=340
Top=465
Width=18
Height=17
Caption="W:"
}
Add(Edit,4264014,483,161)
{
Left=360
Top=460
Width=60
Text=""
link(onChange,15025655:doText,[])
link(Str,5069644:Value3,[(489,145)(405,145)])
}
Add(Label,12972572,77,98)
{
Left=435
Top=465
Width=15
Height=17
Caption="H:"
}
Add(Edit,15025655,532,161)
{
Left=455
Top=460
Width=60
Text=""
link(Str,5069644:Value4,[(538,138)(412,138)])
}
Add(Hub,14274399,140,98)
{
link(onEvent1,10142460:doMonitorParametrs,[])
link(onEvent2,10142460:doScreenShortMonitor,[])
}
Add(MT_MultiMem,5069644,385,91)
{
Count=4
link(onData,1472934:doText,[(424,97)(424,83)(375,83)(375,167)])
}


Редактировалось 2 раз(а), последний 2017-03-28 16:22:05
карма: 22

2
Голосовали:Konst, Леонид
Ответов: 1328
Рейтинг: 69
#7: 2017-03-28 18:19:37 ЛС | профиль | цитата
nesco, работает ноут+монитор win7
карма: 2

1
Голосовали:Леонид
Ответов: 8886
Рейтинг: 823
#8: 2017-03-28 18:39:09 ЛС | профиль | цитата
nesco, IC в последней схеме работает, а переделанный ScreenShort у меня не может работать, что-то с регионами
Отладка писал(а):
C:\A_WinGamesHiAsm\hiasm_4,04b185\Elements\delphi\code\hiScreenShort.pas(43) Error: Undeclared identifier: '_prop_UseRegion'
C:\A_WinGamesHiAsm\hiasm_4,04b185\Elements\delphi\code\hiScreenShort.pas(48) Error: Undeclared identifier: '_data_Region'
C:\A_WinGamesHiAsm\hiasm_4,04b185\Elements\delphi\code\hiScreenShort.pas(60) Error: Undeclared identifier: '_prop_Color'
C:\A_WinGamesHiAsm\hiasm_4,04b185\Elements\delphi\code\hiMainForm_3E96260.pas(8) Fatal: Could not compile used unit 'hiScreenShort.pas'

карма: 19

0
Разработчик
Ответов: 26061
Рейтинг: 2120
#9: 2017-03-28 18:42:16 ЛС | профиль | цитата
Леонид писал(а):
а переделанный ScreenShort у меня не может работать, что-то с регионами

Это надо весь пакет обновлять, там целый блок регионов замутили.
Konst писал(а):
работает ноут+монитор win7

Подождем еще результатов, если все будет нормально, то оформлю отдельным компонентом, а старый компонент трогать не буду.
карма: 22

1
Голосовали:Nickname
Разработчик
Ответов: 26061
Рейтинг: 2120
#10: 2017-03-29 01:46:15 ЛС | профиль | цитата
Добавил новый компонент Monitors. В Example есть пример работы с ним.
карма: 22

2
Голосовали:ser_davkin, Konst
Ответов: 4620
Рейтинг: 746
#11: 2017-03-29 15:13:56 ЛС | профиль | цитата
nesco, ты бы хоть в новом компоненте не писал "ScreenShort"
карма: 26

0
Разработчик
Ответов: 26061
Рейтинг: 2120
#12: 2017-03-29 15:38:10 ЛС | профиль | цитата
Netspirit писал(а):
ты бы хоть в новом компоненте не писал "ScreenShort"

Действительно. Надо исправить. А то я тупо скопировал с предыдущего компонента

--- Добавлено в 2017-03-29 15:46:29

Исправил, можете обновиться.

Редактировалось 2 раз(а), последний 2017-03-29 15:46:29
карма: 22

0
Ответов: 17
Рейтинг: 0
#13: 2017-03-31 06:15:35 ЛС | профиль | цитата
Спасибо, всё работает.
Уточнение про рабочую область, я так понял это область окна без "Панели задач Windows"?
карма: 0

0
Разработчик
Ответов: 26061
Рейтинг: 2120
#14: 2017-03-31 10:19:07 ЛС | профиль | цитата
rav писал(а):
я так понял это область окна без "Панели задач Windows"?

Да.
карма: 22

0
14
Сообщение
...
Прикрепленные файлы
(файлы не залиты)