Форум программистов, компьютерный форум, киберфорум
C# для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.62/13: Рейтинг темы: голосов - 13, средняя оценка - 4.62
91 / 29 / 6
Регистрация: 17.03.2016
Сообщений: 212

Как отследить изменения на дисплее

12.10.2020, 13:28. Показов 2692. Ответов 12
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Необходимо написать программу, которая по таймеру отслеживает определенную область экрана на наличие изменений.
C#
1
2
3
4
5
6
7
8
9
10
11
12
private void timer1_Tick(object sender, EventArgs e)
        {
            Rectangle bounds = this.Bounds;            
            using (Bitmap bitmap = new Bitmap(bounds.Width, bounds.Height))
            {
                using (Graphics g = Graphics.FromImage(bitmap))
                {                  
                    g.CopyFromScreen(new Point(bounds.Left, bounds.Top), Point.Empty, bounds.Size);
                }
                var img = bitmap;
            }
       }
Может можно получить какое-нибудь уникальное значение этого объекта в числовом виде, сохранять его в переменную и в следующем тике сравнивать?
Пробовал функцию GetHashCode, но она каждый раз на одной области выдает разные значение.
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
12.10.2020, 13:28
Ответы с готовыми решениями:

Отследить изменения в файлике и вывести эти изменения в richTextBox1
Господа! Не могу понять всё, как "прокинуть" в статичный метод, другой метод. Суть отследить изменения в файлике и вывести эти...

Как отследить изменения в источнике объекта Image?
Здравствуйте! Как можно отследить изменения в источнике объекта Image? Пробовал подписаться на обработчик ImageOpened, но оно вроде...

Как отследить изменения?
Здравствуйте. Как узнать когда были произведены изменения в той или иной таблице оракла и если возможно узнать что именно было изменено и...

12
управление сложностью
 Аватар для Почтальон
1693 / 1306 / 259
Регистрация: 22.03.2015
Сообщений: 7,545
Записей в блоге: 5
12.10.2020, 13:32
Цитата Сообщение от malkot Посмотреть сообщение
Пробовал функцию GetHashCode, но она каждый раз на одной области выдает разные значение.
Потому что она предназначена для совершенно другого.
"фоткайте" область несколько раз, потом попиксельно сравнивайте. Либо используйте уже готовые библиотеки по компьютерному зрению.
0
484 / 439 / 123
Регистрация: 05.01.2010
Сообщений: 1,848
12.10.2020, 13:34
Навскидку:
1. Если предполагается, что картинки будут совпадать для одинаковых значений - можно сравнивать попиксельно
2. заюзать OCR для распознавания текста(например, tesserract ocr) и сравнивать уже сам текст
0
91 / 29 / 6
Регистрация: 17.03.2016
Сообщений: 212
12.10.2020, 13:35  [ТС]
Допустим я "сфоткал", а как это фото куда-нибудь отложить для последующего сравнения))
попиксельное сравнение вроде нашёл как делается:
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
public bool Equality(Image Img1, Image Img2)
{
    Bitmap Bmp1 = (Bitmap)Img1;
    Bitmap Bmp2 = (Bitmap)Img2;
    if (Bmp1.Size == Bmp2.Size)
    {
        for (int i = 0; i < Bmp1.Width; i++)
            for (int j = 0; j < Bmp1.Height; j++)
                if (Bmp1.GetPixel(i, j) != Bmp2.GetPixel(i, j)) return false;
        return true;
    }
    else return false;
}
0
управление сложностью
 Аватар для Почтальон
1693 / 1306 / 259
Регистрация: 22.03.2015
Сообщений: 7,545
Записей в блоге: 5
12.10.2020, 13:38
Цитата Сообщение от malkot Посмотреть сообщение
Допустим я "сфоткал", а как это фото куда-нибудь отложить для последующего сравнения))
в памяти держать, до появления нового фото, которым будет заменено предыдущее изображение.
0
91 / 29 / 6
Регистрация: 17.03.2016
Сообщений: 212
12.10.2020, 13:41  [ТС]
Это я понимаю, что в памяти. А как написать я не понимаю. Где и как нужно объявить этот объект bitmap чтобы в него можно было положить "фото" любого размера для последующего сравнения.
0
91 / 29 / 6
Регистрация: 17.03.2016
Сообщений: 212
12.10.2020, 14:23  [ТС]
Объявил объект img2 и ещё булеву переменную 1го запуска.
Но получаю ошибку

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
46
47
48
49
50
        bool first = true;
        Bitmap img2;
 
        public Form1()
        {
            InitializeComponent();
            timer1.Interval = 10000;
        }
 
        protected override CreateParams CreateParams
        {
            get
            {
                const int WS_SIZEBOX = 0x40000;
                var cp = base.CreateParams;
                cp.Style |= WS_SIZEBOX;
                return cp;
            }
        }
 
        private void timer1_Tick(object sender, EventArgs e)
        {
            Rectangle bounds = this.Bounds;
            using (Bitmap bitmap = new Bitmap(bounds.Width, bounds.Height))
            {
                using (Graphics g = Graphics.FromImage(bitmap))
                {
                    g.CopyFromScreen(new Point(bounds.Left, bounds.Top), Point.Empty, bounds.Size);
                }
                var img = bitmap;
                
                if (first)
                {
                    img2 = img;
                    first = false;
                }
                else
                {
                    if (Equality(img, img2))
                    {
                        MessageBox.Show("одинаковые");
                    }
                    else
                    {
                        MessageBox.Show("Разные");
                    }
                    img2 = img;
                }
            }
        }
Миниатюры
Как отследить изменения на дисплее  
0
Добрый пёс
 Аватар для Blasphemie
120 / 86 / 37
Регистрация: 13.09.2020
Сообщений: 254
12.10.2020, 14:32
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
public bool Equality(Image Img1, ref Image Img2)
{
    Bitmap Bmp1 = (Bitmap)Img1;
    Bitmap Bmp2 = (Bitmap)Img2; // подзарумевается, что это более старая картинка
    if (Bmp1.Size == Bmp2.Size)
    {
        for (int i = 0; i < Bmp1.Width; i++)
            for (int j = 0; j < Bmp1.Height; j++) 
                if (Bmp1.GetPixel(i, j) != Bmp2.GetPixel(i, j)){
                Img2 = Img1; // заменяем старую  картинку новой, в следующий раз ее уже надо передавать первым параметром
                return true;}
        return false;
    }
 
}
На таймер вещается вся конструкция снимка экрана в переменную NewSegment и последуюшего сравнения.
А в OldSegment лежит предыдущий снимок.
C#
1
bool _changed = Equality(Image NewSegment, ref Image OldSegment);
Добавлено через 5 минут
Поменял return true и false, но зря, исходя из названия метода.
1
91 / 29 / 6
Регистрация: 17.03.2016
Сообщений: 212
12.10.2020, 15:48  [ТС]
Я туплю наверное, никак не получается у меня.
Мы должны изначально передавать 2 изображения в метод Equality, а где их взять 2, если читаем только 1.
0
484 / 439 / 123
Регистрация: 05.01.2010
Сообщений: 1,848
12.10.2020, 16:05
malkot, предыдущий ты уже считал на предыдущем тике таймера
0
Добрый пёс
 Аватар для Blasphemie
120 / 86 / 37
Регистрация: 13.09.2020
Сообщений: 254
12.10.2020, 16:06
Цитата Сообщение от malkot Посмотреть сообщение
Мы должны изначально передавать 2 изображения в метод Equality, а где их взять 2, если читаем только 1.
Один прочитали при старте всей этой канители. Например, по нажатию кнопки включился таймер и каждые х секунд должна выполняться проверка.
Итак, кнопку нажали, кусок экрана сняли в OldSegment и таймер включился. Через интервал по событию timer1_Tick (название может быть другое, конечно) снимается кусок экрана в NewSegment и они сравниваются. Если изменения были - то заменяем OldSegment на NewSegment и дальше выполняем логику, ради которой эта проверка и есть. И так на каждом тике таймера. Если изменений не было - то и менять ничего не надо до следующей проверки.
0
91 / 29 / 6
Регистрация: 17.03.2016
Сообщений: 212
12.10.2020, 16:34  [ТС]
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
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
        Image img2;
 
        public Form1()
        {
            InitializeComponent();
            timer1.Interval = 10000;
        }
 
        protected override CreateParams CreateParams
        {
            get
            {
                const int WS_SIZEBOX = 0x40000;
                var cp = base.CreateParams;
                cp.Style |= WS_SIZEBOX;
                return cp;
            }
        }
        private void button1_Click(object sender, EventArgs e)
        {
            Rectangle bounds = this.Bounds;
            using (Bitmap bitmap = new Bitmap(bounds.Width, bounds.Height))
            {
                using (Graphics g = Graphics.FromImage(bitmap))
                {
                    g.CopyFromScreen(new Point(bounds.Left, bounds.Top), Point.Empty, bounds.Size);
                }
                img2 = bitmap;
            }
            timer1.Start();
        }
 
        private void timer1_Tick(object sender, EventArgs e)
        {
            Rectangle bounds = this.Bounds;
            using (Bitmap bitmap = new Bitmap(bounds.Width, bounds.Height))
            {
                using (Graphics g = Graphics.FromImage(bitmap))
                {
                    g.CopyFromScreen(new Point(bounds.Left, bounds.Top), Point.Empty, bounds.Size);
                }
                var img = bitmap;
                bool _changed = Equality(img, ref img2);
                if (_changed)
                {
                    MessageBox.Show("одинаковые");
                }
                else
                {
                    MessageBox.Show("разные");
                }
            }
 
 
        }
        public bool Equality(Image Img1, ref Image Img2)
        {
            Bitmap Bmp1 = (Bitmap)Img1;
            Bitmap Bmp2 = (Bitmap)Img2; // подзарумевается, что это более старая картинка
            if (Bmp1.Size == Bmp2.Size)
            {
                for (int i = 0; i < Bmp1.Width; i++)
                    for (int j = 0; j < Bmp1.Height; j++)
                        if (Bmp1.GetPixel(i, j) != Bmp2.GetPixel(i, j))
                        {
                            Img2 = Img1; // заменяем старую  картинку новой, в следующий раз ее уже надо передавать первым параметром
                            return false;
                        }
                return true;
            }
            else
            {
                return false;
            }
        }
Снова получаю ошибку:
Миниатюры
Как отследить изменения на дисплее  
0
Добрый пёс
 Аватар для Blasphemie
120 / 86 / 37
Регистрация: 13.09.2020
Сообщений: 254
12.10.2020, 17:13
Значит, в чем-то криво реализован захват. Тут лично я уже не помогу, с этим дела никогда не имел.
Везде претенции к Image или Bitmap.

Кстати, сам захват я бы вынес в отдельный метод типа
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
Bitmap CaptSegment()
 
{
try 
{
            Rectangle bounds = this.Bounds;
            using (Bitmap bitmap = new Bitmap(bounds.Width, bounds.Height))
            {
                using (Graphics g = Graphics.FromImage(bitmap))
                {
                    g.CopyFromScreen(new Point(bounds.Left, bounds.Top), Point.Empty, bounds.Size);
                }
               return bitmap;
}
 
catch
               Message.Show("Что-то пошло не так!"
 
return null; //естественно это затычка, какую-то битмапину оно выдавать должно, хоть белый квадрат.
}
Добавлено через 16 минут
Сдается мне, что проблема здесь
C#
1
g.CopyFromScreen(new Point(bounds.Left, bounds.Top), Point.Empty, bounds.Size);
Point.Empty - не совсем подходящий параметр.

Вот MSDocs, там глянь.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
12.10.2020, 17:13
Помогаю со студенческими работами здесь

Как отследить изменения значения TextView
Здравствуйте, С помощью jsoup через Асинк парсится значения в textView и через кастомный адаптер в listView. При нажатии на на любой...

Как програмно отследить изменения на форме?
Как можно програмно определить произошла ли смена значений в элементах диалога (поле со списком, поле ввода и т.д.)? Можно ли вообще...

Как отследить изменения с другого сайта
Всем привет. Я бы хотел узнать, как отследить изменения с другого сайта и перенести эти изменения на свой? А точнее я бы хотел смотреть...

Как отследить изменения в txt файле?
Мне нужно отслеживать изменения в txt файле, например файл содержит в себе строки: 111111 222222 333333 И когда появится...

Как отследить изменения в textBox-сах?
Добрый вечер! подскажите,плиз,как отследить изменения textBox -сов на листе. Примеры реализации данного вопроса есть для textbox-сов на...


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

Или воспользуйтесь поиском по форуму:
13
Ответ Создать тему
Новые блоги и статьи
Модель ЗдрввоСохранения 7: больше работников, больше ресурсов.
anaschu 08.04.2026
работников и заданий может быть сколько угодно, но настроено всё так, что используется пока что только 20% kYBz3eJf3jQ
Дальние перспективы сервера - слоя сети с космологическим дизайном интефейса карты и логики.
Hrethgir 07.04.2026
Дальнейшее ближайшее планирование вывело к размышлениям над дальними перспективами. И вот тут может быть даже будут нужны оценки специалистов, так как в дальних перспективах всё может очень сильно. . .
Горе от ума
kumehtar 07.04.2026
Эта мне ментальная установка, что вот прямо сейчас, мол, мне для полного счастья не хватает (нужное вписать), и когда я этого достигну - тогда и полный кайф. Одна из самых сильных ловушек на пути. . . .
Использование значений реквизитов справочника в документе, с определенными условиями и правами
Maks 07.04.2026
1. Контроль срока действия договора Алгоритм из решения ниже реализован на примере нетипового документа "ЗаявкаНаРаботу", разработанного в конфигурации КА2. Задача: уведомлять пользователя, если. . .
Доступность команды формы по условию
Maks 07.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "СписаниеМатериалов", разработанного в конфигурации КА2. Задача: сделать доступной кнопку (команда формы "ЗавершитьСписание") при. . .
Уведомление о неверно выбранном значении справочника
Maks 06.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "НарядПутевка", разработанного в конфигурации КА2. Задача: уведомлять пользователя, если в документе выбран неверный склад. . .
Установка Qt Creator для C и C++: ставим среду, CMake и MinGW без фреймворка Qt
8Observer8 05.04.2026
Среду разработки Qt Creator можно установить без фреймворка Qt. Есть отдельный репозиторий для этой среды: https:/ / github. com/ qt-creator/ qt-creator, где можно скачать установщик, на вкладке Releases:. . .
AkelPad-скрипты, структуры, и немного лирики..
testuser2 05.04.2026
Такая программа, как AkelPad существует уже давно, и также давно существуют скрипты под нее. Тем не менее, прога живет, периодически что-то не спеша дополняется, улучшается. Что меня в первую очередь. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru