Используйте значок уведомления, чтобы захватить изображение на экране в C#
Одна проблема с базовой программой захвата экрана заключается в том, что она сидит где-то на экране, поэтому изображение, которое она захватывает, включает в себя изображение самого себя. Иногда вы можете не хотеть этого.
Этот пример обычно невидим и вы взаимодействуете с ним через значок уведомления в системном трее. Поскольку программа не сидит на рабочем столе, она не является частью захвата экрана.
Чтобы использовать значок уведомления, просто добавьте компонент NotifyIcon в форму. Установите свойство ContextMenu компонента в ContextMenu, которое вы хотите отобразить программе, когда пользователь щелкнет правой кнопкой значок.
В этом примере отображается контекстное меню, показанное выше. Команда Capture All захватывает изображение рабочего стола и позволяет сохранить его в файл. Команда «Выбрать область» позволяет щелкнуть и перетащить, чтобы выбрать область, а затем сохранить изображение этой области в файл.
Следующий код показывает, как работает команда Capture All.
// Захват всего экрана. private void mnuWholeScreen_Click(object sender, EventArgs e) { // Получить изображение всего экрана. using (Bitmap bm = GetScreenImage()) { // Сохрани это. SavePicture(bm); } }
Этот код просто вызывает методы GetScreenImage и SavePicture, показанные в следующем коде.
// Возьмите изображение экрана. private Bitmap GetScreenImage() { // Создаем растровое изображение для сохранения результата. Bitmap bm = new Bitmap( Screen.PrimaryScreen.Bounds.Width, Screen.PrimaryScreen.Bounds.Height, PixelFormat.Format24bppRgb); // Скопируем изображение в растровое изображение. using (Graphics gr = Graphics.FromImage(bm)) { gr.CopyFromScreen( Screen.PrimaryScreen.Bounds.X, Screen.PrimaryScreen.Bounds.Y, 0, 0, Screen.PrimaryScreen.Bounds.Size, CopyPixelOperation.SourceCopy); } // Вернуть результат. return bm; } // Сохранение изображения в файле, выбранном пользователем. private void SavePicture(Bitmap bm) { // Позвольте пользователю выбрать файл для хранения изображения. if (sfdScreenImage.ShowDialog() == DialogResult.OK) { // Сохранение растрового изображения в выбранном файле. string filename = sfdScreenImage.FileName; FileInfo file_info = new FileInfo(filename); switch (file_info.Extension.ToLower()) { case ".bmp": bm.Save(filename, ImageFormat.Bmp); break; case ".gif": bm.Save(filename, ImageFormat.Gif); break; case ".jpg": case ".jpeg": bm.Save(filename, ImageFormat.Jpeg); break; case ".png": bm.Save(filename, ImageFormat.Png); break; default: MessageBox.Show("Unknown file type " + file_info.Extension, "Unknown Extension", MessageBoxButtons.OK, MessageBoxIcon.Error); break; } } }
GetScreenImage делает Bitmap размер экрана, а затем использует Graphics класс CopyFromScreen метод для получения изображения экрана.
В методе SavePicture отображается SaveFileDialog, чтобы пользователь мог выбрать файл. Если пользователь выбирает файл и нажимает кнопку «Сохранить», программа сохраняет Bitmap в формате файла, который зависит от расширения файла.
Это полезно, но код, который позволяет захватывать область на рабочем столе, еще более интересен. Когда вы выбираете пункт меню «Область захвата», следующий процесс запускает процесс.
// Позвольте пользователю выбрать часть экрана. private void mnuCaptureArea_Click(object sender, EventArgs e) { // Получить изображение всего экрана. ScreenBm = GetScreenImage(); // Отображение копии. VisibleBm = (Bitmap)ScreenBm.Clone(); // Отобразите его. this.BackgroundImage = VisibleBm; this.Location = new Point(0, 0); this.ClientSize = VisibleBm.Size; this.MouseDown += Form1_MouseDown; this.Show(); }
Этот код использует метод GetScreenImage для получения изображения экрана. Затем он создает копию этого изображения и отображает его в форме программы. Он устанавливает обработчик событий MouseDown и отображает форму.
Когда вы нажимаете кнопку мыши на форме, выполняется следующий обработчик событий.
// Начнем выбирать область. private void Form1_MouseDown(object sender, MouseEventArgs e) { X0 = e.X; Y0 = e.Y; X1 = e.X; Y1 = e.Y; this.MouseDown -= Form1_MouseDown; this.MouseMove += Form1_MouseMove; this.MouseUp += Form1_MouseUp; }
Этот код сохраняет текущую позицию мыши. Он удаляет обработчик событий MouseDown и устанавливает MouseMove и MouseUp обработчики событий. В следующем коде показан обработчик события MouseMove.
// Продолжаем выбирать область. private void Form1_MouseMove(object sender, MouseEventArgs e) { X1 = e.X; Y1 = e.Y; using (Graphics gr = Graphics.FromImage(VisibleBm)) { // Скопируем исходное изображение. gr.DrawImage(ScreenBm, 0, 0); // Нарисуем выделенную область. Rectangle rect = new Rectangle( Math.Min(X0, X1), Math.Min(Y0, Y1), Math.Abs(X1 - X0), Math.Abs(Y1 - Y0)); gr.DrawRectangle(Pens.Yellow, rect); } this.Refresh(); }
Этот обработчик событий создает объект Graphics, связанный с растровым изображением VisibleBm, который в настоящее время отображается в форме. Он рисует исходное изображение на экране на этом растровом изображении, а затем добавляет желтый прямоугольник, показывающий область, выбранную пользователем.
В следующем коде показан обработчик события MouseUp.
// Завершите выбор области. private void Form1_MouseUp(object sender, MouseEventArgs e) { this.Visible = false; this.MouseMove -= Form1_MouseMove; this.MouseUp -= Form1_MouseUp; // Сохранение выбранной части изображения. int wid = Math.Abs(X1 - X0); int hgt = Math.Abs(Y1 - Y0); Rectangle dest_rect = new Rectangle(0, 0, wid, hgt); Rectangle source_rect = new Rectangle( Math.Min(X0, X1), Math.Min(Y0, Y1), Math.Abs(X1 - X0), Math.Abs(Y1 - Y0)); using (Bitmap selection = new Bitmap(wid, hgt)) { // Скопируем выбранную область. using (Graphics gr = Graphics.FromImage(selection)) { gr.DrawImage(ScreenBm, dest_rect, source_rect, GraphicsUnit.Pixel); } // Сохранение выбранной области. SavePicture(selection); } // Утилизируйте другие растровые изображения. this.BackgroundImage = null; ScreenBm.Dispose(); VisibleBm.Dispose(); ScreenBm = null; VisibleBm = null; }
Этот обработчик событий скрывает форму и удаляет обработчики событий мыши. Он копирует выбранную часть исходного изображения экрана в новый размер растрового изображения, соответствующий размеру, и вызывает SavePicture, чтобы пользователь мог сохранить выбранную область в файл.