Форум программистов, компьютерный форум, киберфорум
C# .NET
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.54/13: Рейтинг темы: голосов - 13, средняя оценка - 4.54
4 / 4 / 1
Регистрация: 24.09.2013
Сообщений: 25
.NET 4.x

Виснет Graphics при вызове CopyFromScreen

23.03.2016, 11:18. Показов 2536. Ответов 8
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Доброго времени суток, уважаемые!
У меня вопрос: При следующей реализации метода получения скрина рабочего стола
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
using (Bitmap bmp = new Bitmap(width, height, System.Drawing.Imaging.PixelFormat.Format16bppRgb565))
                {
                    using (Graphics g = Graphics.FromImage(bmp))
                    {
                        g.InterpolationMode = System.Drawing.Drawing2D.InterpolationMode.Low;
                        g.PixelOffsetMode = System.Drawing.Drawing2D.PixelOffsetMode.HighSpeed;
                        g.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.HighSpeed;
 
                        g.CopyFromScreen(0, 0, 0, 0, new System.Drawing.Size(width, height));
 
                        g.Flush(System.Drawing.Drawing2D.FlushIntention.Flush);
                    }
 
                    using (var ms = new MemoryStream())
                    {
                        bmp.SetResolution(0.001f, 0.001f);
                        bmp.Save(ms, ImageFormat.Jpeg);
                        return ms.ToArray();
                    }
                }
происходит подвисание. Если повесить все это на таймер с частотой 1000/24 мс, получается дерганье приложения.
Пробовал запихнуть в отдельный поток, не помогло. Пробовал реализацию с WinAPI, немного лучше, но так же есть дерганье... Может кто подскажет, как быть? Или кто подскажет другой вариант сделать скрин с наименьшими потерями.

Сама задача такова, необходимо получать скрин с экрана с частотой 24 кадра в секунду(эдакое мини видео), но естественно без висяков приложения.
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
23.03.2016, 11:18
Ответы с готовыми решениями:

Использование Graphics.CopyFromScreen
Здравствуйте! Как получить данные в виде массива байт которые Graphics.CopyFromScreen() скопировал с экрана? Или подскажите, как по другому...

Програма виснет при вызове функций find_intersection
доброго времени суток, возникла проблема с програмкой #include <stdio.h> #include <stdlib.h> #include <time.h> #define...

Ошибка при вызове деструктора (при вызове delete в деструкторе)
Не могу найти ошибку, при вызове деструктора от класса, который был создан при помощи конструктора с параметром const String &,...

8
3 / 3 / 2
Регистрация: 10.11.2013
Сообщений: 175
28.03.2016, 23:38
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Drawing;
using System.Windows.Controls;
 
namespace ScreenShot_of__desktop
{
    class Program
    {
        static Bitmap CaptureScreen()
        {
            Bitmap BMP = new Bitmap(System.Windows.Forms.Screen.PrimaryScreen.Bounds.Width,
                                    System.Windows.Forms.Screen.PrimaryScreen.Bounds.Height,
                                    System.Drawing.Imaging.PixelFormat.Format32bppArgb);
            System.Drawing.Graphics GFX = System.Drawing.Graphics.FromImage(BMP);
            GFX.CopyFromScreen(System.Windows.Forms.Screen.PrimaryScreen.Bounds.X,
                                System.Windows.Forms.Screen.PrimaryScreen.Bounds.Y,
                                0, 0,
                                System.Windows.Forms.Screen.PrimaryScreen.Bounds.Size,
                                System.Drawing.CopyPixelOperation.SourceCopy);
 
            return BMP;
        }
 
        static void Main(string[] args)
        {
            Console.WriteLine("Enter 1 if you wonna make a screenshot... ");
            int i;
            i = Convert.ToInt32(Console.ReadLine());
 
            if (i == 1)
            {
                Image rer = CaptureScreen();
                rer.Save(@"Путь.jpg");
                Console.WriteLine("ScreenShot has been made succesful on the Desctop");
            }
            else { Console.WriteLine("Try again ... "); return; }
            Console.ReadKey();
        }
 
    }
}
0
4 / 4 / 1
Регистрация: 24.09.2013
Сообщений: 25
30.03.2016, 08:26  [ТС]
Спасибо конечно, а чем этот код отличается от моего? Мой код кстати даже быстрее, так как пишет в формате 16bppRgb565, а это быстрее 32bppArgb.

Если суть заключается в статике?
Так я использую отдельный класс, в котором один раз создается Bitmap и Graphics в конструкторе, а в методе получаю скрин, и не сохраняю его в файл, а держу в памяти(MemoryStream), для дальнейшей передачи.

Так вот вопрос, в том, что когда я делаю CopyFromScreen приложение подвисает.
0
 Аватар для LeniumSoft
1454 / 847 / 150
Регистрация: 06.06.2012
Сообщений: 2,370
30.03.2016, 10:12
Цитата Сообщение от AlexART13 Посмотреть сообщение
когда я делаю CopyFromScreen приложение подвисает
И ты не попробовал поискать другой путь?

Вот http://www.codeproject.com/Art... in-a-Movie
запись видео с экрана вместе со звуком.
1
4 / 4 / 1
Регистрация: 24.09.2013
Сообщений: 25
30.03.2016, 13:21  [ТС]
И ты не попробовал поискать другой путь?
Пробовал и BitBlt и про потоковое видео читал, с последним не очень нравится, что придется использовать dll файлы. Хочется иметь только исполняемый файл в итоге.

Может есть еще варианты?
0
979 / 874 / 350
Регистрация: 26.04.2012
Сообщений: 2,647
30.03.2016, 17:17
AlexART13, многие dll(но не все) можно склеить с EXEшником при помощи утилиты ILMerge. Можно придумать и извращения с запихиванием их в ресурсы, или еще как-нибудь. Только зачем? Чем вас dll не устраивает?
0
4 / 4 / 1
Регистрация: 24.09.2013
Сообщений: 25
31.03.2016, 08:17  [ТС]
EvilFromHell, Я согласен, можно придумать что угодно. И даже согласен с тем, что Net приложение не совсем подходит для одноэкзешной архитектуры проекта, тут лучше использовать c++ например.
Дело в том, что хочу сделать приложение удаленного управления для своей организации. Использовать платные аналоги нет возможности. Сразу оговорюсь о бесплатных периодах, мне надо мониторить несколько ПК одновременно, 24/7.
А одноэкзешное почему? Для мобильности. Чтобы не заморачиваться с установкой, да и просто опыт написания подобных программ.
0
979 / 874 / 350
Регистрация: 26.04.2012
Сообщений: 2,647
31.03.2016, 16:33
AlexART13, а как связано использование dll с заморочками по поводу установки? Ну будете вы вместо одного exe перекидывать архив из 3х-4ех файлов. Суть от этого не изменится.
1
4 / 4 / 1
Регистрация: 24.09.2013
Сообщений: 25
05.04.2016, 11:15  [ТС]
EvilFromHell, Ладно, я понял. Спасибо.

PS. Упрям, нашел способ как делать скрин не завешивая приложение. Но все же буду писать видео передачу. Это быстрее.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
05.04.2016, 11:15
Помогаю со студенческими работами здесь

Класс - Ошибки при вызове методов: В вызове функции отсутствует список аргументов
Добрый вечер всем! При изучении и написании работы столкнулся с ошибкой от которой не могу избавиться. (Т.к. очень сильно плаваю в ООП)....

Виснет программа при компиляции, степовер не работает, так же виснет
Виснет программа при компиляции, степовер не работает, так же виснет. Программа - простейший калькулятор. ...

CopyFromScreen - Неверный дескриптор
Всем привет. Есть прога, которая делает периодически скриншоты нужной области var size = new Size(295, 71); var bmp = new...

Graphics.SetClip Method (GraphicsPath) и Graphics.Clear Method vs Graphics.FillPath Method (System.Drawing)
У нас два способа залить форму: 1. Graphics.SetClip Method (GraphicsPath) and Graphics.Clear 2. Graphics.FillPath Method...

Где скачать Borland С++ с поддержкой graphics.h. Уроки по библеотеке graphics.h
Подскажите, нужен Borland С++ с поддержкой graphics.h. Я видел только 1 борланд и выглядело все там не так как мне нужно. Есть новый...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
9
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Реализация движения на Box2D v3 - трение и коллизии с повёрнутыми стенами
8Observer8 20.02.2026
Содержание блога Box2D позволяет легко создать главного героя, который не проходит сквозь стены и перемещается с заданным трением о препятствия, которые можно располагать под углом, как верхнее. . .
Конвертировать закладки radiotray-ng в m3u-плейлист
damix 19.02.2026
Это можно сделать скриптом для PowerShell. Использование . \СonvertRadiotrayToM3U. ps1 <path_to_bookmarks. json> Рядом с файлом bookmarks. json появится файл bookmarks. m3u с результатом. # Check if. . .
Семь CDC на одном интерфейсе: 5 U[S]ARTов, 1 CAN и 1 SSI
Eddy_Em 18.02.2026
Постепенно допиливаю свою "многоинтерфейсную плату". Выглядит вот так: https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11617&stc=1&d=1771445347 Основана на STM32F303RBT6. На борту пять. . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила» «Время-Деньги» «Деньги -Пуля»
SDL3 для Web (WebAssembly): Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 12.02.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами и вызывать обработчики событий столкновения. . . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru