BitBlt и скриншот с полноэкранного приложения
От: Thespian Украина  
Дата: 11.04.07 21:18
Оценка:
Пытался сначала сделать сам. Не вышло. Поискал тут решения, нашёл одно. Далее в коде оно есть.
Но есть проблема, если данным методом делать скриншот со старого полноэкранного приложения (старой игры, например, старкрафт), то качество получается ужасное, и используется всего 20 цветов из 256. Палитра растягивается до 256 цветов, но только 20 цветов там есть и они повторяются циклически. Как можно это решить?
Заранее благодарен.

        public Bitmap GetScreenShot(int width, int height)
        {
            int x = 0, y = 0;
            //получаем dc экрана
            IntPtr hDCSource = CreateDC("DISPLAY", null, null, IntPtr.Zero);
            //создаем другой dc, совмещаемый с источником
            IntPtr hDCDestination = CreateCompatibleDC(hDCSource);
            //создаем bitmap, совмещаемый с источником
            IntPtr hBitmap = CreateCompatibleBitmap(hDCSource, width, height);
            //выбираем bitmap в dc
            SelectObject(hDCDestination, hBitmap);
            //копируем из источника
            BitBlt(hDCDestination, 0, 0, width, height, hDCSource, x, y, SRCCOPY | CAPTUREBLT);
            Bitmap bitmap = Bitmap.FromHbitmap(hBitmap);
            pb.Image = bitmap;
            DeleteObject(hDCDestination);
            DeleteObject(hBitmap);
            ReleaseDC(IntPtr.Zero, hDCSource);
            return bitmap;
        }

        //А вот импорт:
        public const int CAPTUREBLT = 0x40000000;
        public const int SRCCOPY = 0x00CC0020;
        [DllImport("gdi32.dll")]
        static extern IntPtr CreateDC(string lpszDriver, string lpszDevice, string lpszOutput, IntPtr lpInitData);
        [DllImport("Gdi32.dll")]
        public static extern int BitBlt(IntPtr hdcDest,int nXDest,int nYDest,int nWidth,int nHeight,IntPtr hdcSrc,int nXSrc,int nYSrc,int dwRop);
        [DllImport("user32.dll")]
        public static extern int ReleaseDC(IntPtr hWnd, IntPtr hDC);
        [DllImport("user32.dll")]
        public static extern IntPtr GetDC(IntPtr hWnd);
        [DllImport("Gdi32.dll")]
        public static extern IntPtr SelectObject(IntPtr hDC, IntPtr hGdiObj);
        [DllImport("Gdi32.dll")]
        public static extern IntPtr CreateCompatibleDC(IntPtr hdc);
        [DllImport("Gdi32.dll")]
        public static extern IntPtr CreateCompatibleBitmap(IntPtr hDC, int nWidth, int nHeight);
        [DllImport("Gdi32.dll")]
        public static extern int DeleteObject(IntPtr hObject);


        //Вызов
        GetScreenShot(Screen.PrimaryScreen.Bounds.Width, Screen.PrimaryScreen.Bounds.Height);


12.04.07 18:49: Перенесено модератором из '.NET' — TK
Re: BitBlt и скриншот с полноэкранного приложения
От: _Morpheus_  
Дата: 12.04.07 09:35
Оценка:
Здравствуйте, Thespian, Вы писали:

T>Но есть проблема, если данным методом делать скриншот со старого полноэкранного приложения (старой игры, например, старкрафт), то качество получается ужасное, и используется всего 20 цветов из 256. Палитра растягивается до 256 цветов, но только 20 цветов там есть и они повторяются циклически. Как можно это решить?


никак, ну разве что делать скриншот старыми досовскими программами

тут проблема не в том что приложение полноэкранное, а в том что оно досовское и видеодрайверы винды не использует. Видеодрайверы в данном случае используются виртуальной машиной, по особому — для эмуляции прямого доступа к портам, поэтому использовать GDI функции для получения скриншота не получится.
... << RSDN@Home 1.2.0 alpha rev. 676>>
Re[2]: BitBlt и скриншот с полноэкранного приложения
От: Thespian Украина  
Дата: 12.04.07 11:17
Оценка:
Здравствуйте, _Morpheus_, Вы писали:

_M_>никак, ну разве что делать скриншот старыми досовскими программами


_M_>тут проблема не в том что приложение полноэкранное, а в том что оно досовское и видеодрайверы винды не использует. Видеодрайверы в данном случае используются виртуальной машиной, по особому — для эмуляции прямого доступа к портам, поэтому использовать GDI функции для получения скриншота не получится.



Некоторые приложения умеют делать качественніе снимки и с этих "досоывских" программ. Наверное, стоит вопрос о том, как сделав снимок с экрана, подменить палитру, и как получить досовскую палитру из 256 цветов?
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.