Re[3]: снова mirror driver
От: Neco  
Дата: 30.08.07 20:15
Оценка:
Пока начиркал вот это:

            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);


картинка почему-то перевёрнута по горизонтали...
всю ночь не ем, весь день не сплю — устаю
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.