Книга: Программирование КПК и смартфонов на .NET Compact Framework

Создание экранных снимков

Создание экранных снимков

Если при работе с мобильным устройством необходимо сделать скриншоты, то для реализации замысла необходимо использовать внешние устройства. Конечно, можно просто сфотографировать экран, но настоящий программист будет использовать функции Windows API. В этом разделе главы будет рассматриваться пример копирования определенной области окна, всего рабочего окна программы или любого другого окна. Для демонстрации примера надо разместить на форме список, три кнопки и один таймер. Сам код приведен в листинге 6.20.

Листинг 6.20

[DllImport("coredll.dll", EntryPoint = "GetDesktopWindow")]
public static extern IntPtr GetDesktopWindow();
[DllImport("coredll.dll", EntryPoint = "GetDC")]
public static extern IntPtr GetDC(IntPtr hWnd);
[DllImport("coredll.dll", EntryPoint = "ReleaseDC")]
public static extern IntPtr ReleaseDC(IntPtr hWnd, IntPtr hDC);
[DllImport("coredll.dll")]
public static extern int BitBlt(IntPtr hdcDest, int nXDest, int nYDest,
 int nWidth, int nHeight, IntPtr hdcSrc, int nXSrc, int nYSrc, uint dwRop);
 const int SRCCOPY = 0x00CC0020;
private void screenshot(string filename, Graphics gx, Rectangle rect) {
 Bitmap bmp = new Bitmap(rect.Width, rect.Height);
 Graphics g = Graphics.FromImage(bmp);
 BitBlt(g.GetHdc(), 0, 0, rect.Width, rect.Height, gx.GetHdc(),
  rect.Left, rect.Top, SRCCOPY);
 bmp.Save(filename, System.Drawing.Imaging.ImageFormat.Bmp);
 bmp.Dispose();
 g.Dispose();
}
private void butPartOfWindow_Click(object sender, EventArgs e) {
 // Делаем снимок списка
 ScreenShot(@"My Documentssave.bmp", this.CreateGraphics(),
  listBox1.Bounds);
}
private void butScreen_Click(object sender, EventArgs e) {
 // Делаем снимок экрана
 Rectangle rect = new Rectangle(0,0,240,240);
 Bitmap bmp = new Bitmap(rect.Width, rect.Height);
 Graphics g = Graphics.FromImage(bmp);
 IntPtr hwnd = GetDesktopWindow();
 IntPtr hdc = GetDC(hwnd);
 BitBlt(g.GetHdc(), 0, 0, rect.Width, rect.Height, hdc, rect.Left,
  rect.Top, SRCCOPY);
 bmp.Save(@"My Documentsscreen.bmp",
 System.Drawing.Imaging.ImageFormat.Bmp);
 // Освобождаем ресурсы
 ReleaseDC(hwnd, hdc);
 bmp.Dispose();
 g.Dispose();
}
private void timer1_Tick(object sender, EventArgs e) {
 // Делаем снимок экрана через 5 секунд
 Rectangle rect = new Rectangle(0, 0. 240, 240);
 Bitmap bmp = new Bitmap(rect.Width, rect.Height);
 Graphics g = Graphics.FromImage(bmp);
 IntPtr hwnd = GetDesktopWindow();
 IntPtr hdc = GetDC(hwnd);
 BitBlt(g.GetHdc(), 0, 0, rect.Width, rect.Height, hdc, rect.Left,
  rect.Top, SRCCOPY);
 bmp.Save(@"My Documents5sec.bmp", System.Drawing.Imaging.ImageFormat.Bmp);
 // Освобождаем ресурсы
 ReleaseDC(hwnd, hdc);
 bmp.Dispose();
 g.Dispose();
 timer1.Enabled = false;
}
private void but5Sec_Click(object sender, EventArgs e) {
 timer1.Enabled = true;
}

Функция ScreenShot позволяет быстро получить участок экрана и сохранить его в графическом файле. В рассмотренном примере внешний вид списка сохраняется в файле listbox.bmp. Для этого достаточно было указать имя файла, объект Graphics и размеры списка ListBox. Для получения снимка экрана пример пришлось несколько усложнить, добавив вызовы функций GetDesktopWindow и GetDC.

Если нужно получить снимок другой программы, то придется воспользоваться таймером. После запуска таймера в распоряжении пользователя будет 5 секунд, чтобы запустить другое приложение. Основная программа будет работать в фоновом режиме и сделает снимок экрана.

Чтобы проверить работу приложения, нужно запустить программу, нажать каждую кнопку, а затем с помощью программы File Explorer найти сохраненные файлы.

ВНИМАНИЕ

Нужно проявлять определенную осторожность при работе с методом Bitmap.Save(). Дело в том, что в Windows Mobile 2003 и более ранних версиях операционных систем библиотека .NET Compact Framework не поддерживает сохранение графических файлов в форматах GIF, JPEG или PNG. Сохранять файлы можно только в формате BMP. Причем во время написания кода редактор не заметит ошибки и позволит запустить программу с неправильным вызовом метода. Однако при вызове метода возникнет исключение NotSupportedException. К счастью, в Windows Mobile 5.0 поддерживаются все четыре графических формата.

Оглавление книги


Генерация: 0.037. Запросов К БД/Cache: 0 / 0
поделиться
Вверх Вниз