Пытался сначала сделать сам. Не вышло. Поискал тут решения, нашёл одно. Далее в коде оно есть.
Но есть проблема, если данным методом делать скриншот со старого полноэкранного приложения (старой игры, например, старкрафт), то качество получается ужасное, и используется всего 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
Здравствуйте, Thespian, Вы писали:
T>Но есть проблема, если данным методом делать скриншот со старого полноэкранного приложения (старой игры, например, старкрафт), то качество получается ужасное, и используется всего 20 цветов из 256. Палитра растягивается до 256 цветов, но только 20 цветов там есть и они повторяются циклически. Как можно это решить?
никак, ну разве что делать скриншот старыми досовскими программами
тут проблема не в том что приложение полноэкранное, а в том что оно досовское и видеодрайверы винды не использует. Видеодрайверы в данном случае используются виртуальной машиной, по особому — для эмуляции прямого доступа к портам, поэтому использовать GDI функции для получения скриншота не получится.
... << RSDN@Home 1.2.0 alpha rev. 676>>
Здравствуйте, _Morpheus_, Вы писали:
_M_>никак, ну разве что делать скриншот старыми досовскими программами
_M_>тут проблема не в том что приложение полноэкранное, а в том что оно досовское и видеодрайверы винды не использует. Видеодрайверы в данном случае используются виртуальной машиной, по особому — для эмуляции прямого доступа к портам, поэтому использовать GDI функции для получения скриншота не получится.
Некоторые приложения умеют делать качественніе снимки и с этих "досоывских" программ. Наверное, стоит вопрос о том, как сделав снимок с экрана, подменить палитру, и как получить досовскую палитру из 256 цветов?