Пока начиркал вот это:
GETCHANGESBUF buf = new GETCHANGESBUF();
buf.userbuffer = 0;
CHANGES_BUF tmp_chbuf = new CHANGES_BUF();
tmp_chbuf.counter = 0;
tmp_chbuf.pointrect = new CHANGES_RECORD[MAXCHANGES_BUF];
for (int i = 0; i < MAXCHANGES_BUF; i++) {
tmp_chbuf.pointrect[i] = new CHANGES_RECORD();
}
int tmpbuf_sz = Marshal.SizeOf(tmp_chbuf);
IntPtr buf_ptr = Marshal.AllocHGlobal(tmpbuf_sz);
Marshal.StructureToPtr(tmp_chbuf, buf_ptr, false);
buf.buffer = buf_ptr.ToInt32();
//CHANGES_BUF test = new CHANGES_BUF();
//int sz = Marshal.SizeOf(test);
//test.pointrect = new CHANGES_RECORD[1];
//test.pointrect[0] = new CHANGES_RECORD();
//int sz2 = Marshal.SizeOf(test.pointrect[0]);
int dnum = 0;
DISPLAY_DEVICE disp = new DISPLAY_DEVICE();
disp.cb = Marshal.SizeOf(disp);
//string devName = @"\\.\DISPLAYV1";
//string devDescr = "Microsoft Mirror Driver";
string devDescr = "Mirage Driver";
int ret;
while ((ret = EnumDisplayDevices(0, dnum, ref disp, 0)) > 0) {
if (devDescr == disp.DeviceString)
break;
dnum++;
}
int hdeskCurrent, hdeskInput;
hdeskInput = 0;
hdeskCurrent = GetThreadDesktop(GetCurrentThreadId());
if (hdeskCurrent != 0) {
bool out_bool = false;
hdeskInput = OpenInputDesktop(0, ref out_bool, MAXIMUM_ALLOWED);
if (hdeskInput != 0)
SetThreadDesktop(hdeskInput);
}
DEVMODE devmode = new DEVMODE();
devmode.dmSize = 156;// (short)Marshal.SizeOf(devmode);
devmode.dmFields = DM_BITSPERPEL | DM_PELSWIDTH | DM_PELSHEIGHT;
devmode.dmDeviceName = "";
devmode.dmBitsPerPel = 32;
devmode.dmFields |= DM_POSITION;
devmode.dmPelsWidth = 100;
devmode.dmPelsHeight = 100;
//devmode.dmDeviceName = "mirror";
int mcode = ChangeDisplaySettingsEx(disp.DeviceName, ref devmode, 0, CDS_UPDATEREGISTRY, 0);
//mcode = ChangeDisplaySettingsEx(disp.DeviceName, ref devmode, 0, 0, 0);
int w32err = System.Runtime.InteropServices.Marshal.GetLastWin32Error();
SetThreadDesktop(hdeskCurrent);
CloseDesktop(hdeskInput);
//string mout = "";
int mdc = CreateDC2(disp.DeviceName, 0, 0, 0);
//int eret;
//eret = ExtEscape2(mdc, TESTMAPPED, 0, null, 0, null);
int sz_buf = Marshal.SizeOf(buf);
IntPtr ptr = Marshal.AllocHGlobal(sz_buf);
Marshal.StructureToPtr(buf, ptr, false);
int drvCr = ExtEscape(
mdc,
MAP1,
0, 0,
sz_buf, ptr.ToInt32());
//Marshal.PtrToStructure(ptr, buf);
object obj = Marshal.PtrToStructure(ptr, typeof(GETCHANGESBUF));
buf = (GETCHANGESBUF)obj;
//exte
BITMAPINFO binfo = new BITMAPINFO();
int hDib;
int dibAddr = 0;
binfo.bmiHeader.biSize = 40;
binfo.bmiHeader.biWidth = 100;
binfo.bmiHeader.biHeight = 100;
binfo.bmiHeader.biPlanes = 1;
binfo.bmiHeader.biBitCount = 32;
binfo.bmiHeader.biCompression = 0;
binfo.bmiHeader.biSizeImage = (int)((binfo.bmiHeader.biWidth + 3) & 0xFFFFFFFC) * binfo.bmiHeader.biHeight;
int scrDc = GetDC(0);
int memDc = CreateCompatibleDC(scrDc);
hDib = CreateDIBSection(memDc, ref binfo, DIB_RGB_COLORS, ref dibAddr, 0, 0);
int oldDib = SelectObject(memDc, hDib);
int ptr_src = buf.userbuffer;
int ptr_dst = dibAddr;
int len = binfo.bmiHeader.biSizeImage;
CopyMemory(ptr_dst, ptr_src, len);
int picdc = GetDC(pichwnd);
BitBlt(picdc, 0, 0, binfo.bmiHeader.biWidth, binfo.bmiHeader.biHeight, memDc, 0, 0, SRCCOPY);
ReleaseDC(pichwnd, picdc);
ReleaseDC(0, scrDc);
SelectObject(memDc, oldDib);
DeleteObject(hDib);
DeleteDC(memDc);
drvCr = ExtEscape(
mdc,
UNMAP1,
sz_buf, ptr.ToInt32(),
0, 0);
DeleteDC(mdc);
картинка почему-то перевёрнута по горизонтали...