Вверх ↑
Разработчик
Ответов: 26313
Рейтинг: 2146
#1: 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)])
}

карма: 22

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