powered by simpleCommunicator - 2.0.56     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / Момент отлова
25 сообщений из 37, страница 1 из 2
Момент отлова
    #36421870
GorloPavel
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Здравствуйте. Подскажите пожалуйста. Возможно ли отловить момент изменения изображения на экране? И возможно ли узнать в каком месте экрана(координаты) произошли изменения? Может есть в природе какая-нибудь API функция или класс .NET... Пишу аналог Radmin-а на C#. Хотелось бы не слать скриншоты(очень медленно) как это реализованно сейчас, а только изменившейся участок. Сравнение изображений попиксельно тоже получается очень медленно. Слышал про миррор драйвер, но для меня к сожалению эта тема пока не подъемная. Кто что посоветует? Заранее ОГРОМНОЕ человеческое спасибо.
...
Рейтинг: 0 / 0
Момент отлова
    #36428090
GorloPavel
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
...
...
Рейтинг: 0 / 0
Момент отлова
    #36428234
Dr_Wolf
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
1. бейте скриншот на квадраты
2. вычисляйте хэш для каждого
3. сравнивайте с предыдущим
4. если изменился - на сервер этот маленький кусок + его относительные координаты
...
Рейтинг: 0 / 0
Момент отлова
    #36431230
Фотография дерево
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dr_Wolf1. бейте скриншот на квадраты
2. вычисляйте хэш для каждого
3. сравнивайте с предыдущим
4. если изменился - на сервер этот маленький кусок + его относительные координаты

ничем не лучше. Если не хуже.

А лучше - напрямую из видеокарты массив читать и передавать. В момент вывода на монитор. Весь. Поток перенаправлять в поток без дополнительной обработки.
...
Рейтинг: 0 / 0
Момент отлова
    #36432280
Sergey H.
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dr_Wolf,

Угу, только все изменившиеся квадраты сразу. А то будет поквадратно обновлять, некрасиво получится.
...
Рейтинг: 0 / 0
Момент отлова
    #36432374
Arm79
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ну вообще в WinAPI есть такие интересные функции как GetUpdateRect & GetUpdateRgn
Можно через p/invoke сделать к ним обертку
...
Рейтинг: 0 / 0
Момент отлова
    #36432378
Arm79
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Забыл добавить еще GetDC для отлова рабочего стола
...
Рейтинг: 0 / 0
Момент отлова
    #36432649
GorloPavel
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Спасибо огромное за ответы и подсказки. Возникла проблема. Функция GetUpdateRect всегда возвращает false и пустой(с нулевыми значениями) RECT. В чем грабли? Спасибо.

Код: plaintext
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.
    public partial class Form1 : Form
    {
        [StructLayout(LayoutKind.Sequential)]
        public struct RECT
        {
            public int Left;
            public int Top;
            public int Right;
            public int Bottom;
            
        }

        [DllImport("user32.dll")]
        public static extern bool GetUpdateRect(IntPtr hWnd, ref RECT lpRect, bool bErase);
        
        [DllImport("user32.dll", CharSet = CharSet.Auto, ExactSpelling = true)]
        public static extern IntPtr GetDesktopWindow();
      
        [DllImport("user32.dll")]
        public static extern bool GetWindowRect(IntPtr handle, ref RECT rect);

        RECT rc = new RECT();

        public Form1()
        {
            InitializeComponent();
        }

        public void GetUpdRectWindow()
        {
            if (GetWindowRect(GetDesktopWindow(), ref rc))
            {
                if (GetUpdateRect(GetDesktopWindow(), ref rc, true))
                {
                    MessageBox.Show("Область получена!");
                }
                else
                {
                    MessageBox.Show("Область не получена!");
                }
            }
        }

        private void button1_Click(object sender, EventArgs e)
        {
            GetUpdRectWindow();
        }

    }
...
Рейтинг: 0 / 0
Момент отлова
    #36432973
Arm79
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
1) Я не говорил про GetDesktopWindow. Было GetDC
2) В каждой функции явно пропишите Charser. Судя по типам, это фиолетово, но я всегда явно специфицирую.
...
Рейтинг: 0 / 0
Момент отлова
    #36433590
GorloPavel
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
К сожалению ничего не выходит :( Все равно "пустой" RECT :(

Код: plaintext
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.
public partial class Form1 : Form
    {
        [StructLayout(LayoutKind.Sequential)]
        public struct RECT
        {
            public int Left;
            public int Top;
            public int Right;
            public int Bottom;
            
        }

        [DllImport("user32.dll", CharSet = CharSet.Auto, ExactSpelling = true)]
        public static extern bool GetUpdateRect(IntPtr hWnd, ref RECT lpRect, bool bErase);
        
        [DllImport("user32.dll", CharSet = CharSet.Auto, ExactSpelling = true)]
        public static extern IntPtr GetDesktopWindow();

        [DllImport("user32.dll", CharSet = CharSet.Auto, ExactSpelling = true)]
        public static extern bool GetWindowRect(IntPtr handle, ref RECT rect);

        [DllImport("user32.dll", CharSet = CharSet.Auto, ExactSpelling = true)]
        static extern IntPtr GetDC(IntPtr hWnd);

        RECT rc = new RECT();

        public Form1()
        {
            InitializeComponent();
        }

        public void GetUpdRectWindow()
        {
            if (GetWindowRect(GetDC(this.Handle), ref rc))
            {
                if (GetUpdateRect(GetDC(this.Handle), ref rc, true))
                {
                    MessageBox.Show("Область получена!");
                }
                else
                {
                    MessageBox.Show("Область не получена!");
                }
            }
        }

        private void button1_Click(object sender, EventArgs e)
        {
            GetUpdRectWindow();
        }
...
Рейтинг: 0 / 0
Момент отлова
    #36435250
Arm79
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Смотрели сайт pinvoke.net? Там и сигнатуры правильно расписаны, и использован HandleRef

здесь
...
Рейтинг: 0 / 0
Момент отлова
    #36435944
GorloPavel
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Удалось получить область изменения окна программы. Нужно было запустить в отдельном потоке. Работает как-то странно. Срабатывает только тогда когда я изменяю размер окна, но когда я к примеру рисую что-нибудь на форме, то ничего не происходит. Так как же получить регион(прямогольник) экрана в котором произошли изменения? Не могу сообразить... Пробовал передавать в функцию хендл раб. стола(GetDesktopWindow()), но нечего не происходит... Заранее спасибо за помощь!
...
Рейтинг: 0 / 0
Момент отлова
    #36435960
Фотография Ken@t
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
...
Рейтинг: 0 / 0
Момент отлова
    #36435964
GorloPavel
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вот код к моему предыдущему посту :


Код: plaintext
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.
public partial class Form1 : Form
    {

        Thread th = null;
        HandleRef hndlref;
        
        public Form1()
        {
            InitializeComponent();
            th = new Thread(new ThreadStart(thread));
            hndlref = new HandleRef(this, this.Handle);
        }

        [DllImport("user32.dll")]
        static extern IntPtr GetDC(HandleRef hWnd);

        [DllImport("user32.dll")]
        static extern int GetUpdateRgn(IntPtr hWnd, IntPtr hRgn, bool bErase);

        [DllImport("user32.dll")]
        static extern bool GetUpdateRect(IntPtr hWnd, IntPtr lpRect, bool bErase);

        [DllImport("user32.dll")]
        static extern bool GetUpdateRect(HandleRef hWnd, out RECT rect, bool bErase);
        
        [DllImport("user32.dll")]
        private static extern IntPtr GetDesktopWindow();

        [DllImport("user32.dll")]
        private static extern IntPtr GetWindowDC(IntPtr handle);

        [StructLayout(LayoutKind.Sequential)]
        public struct RECT
        {
            public int Left;
            public int Top;
            public int Right;
            public int Bottom;
        }
 
        RECT rct;

        private void thread()
        {
            while (true)
            {
                if (GetUpdateRect(hndlref, out rct, false)) { 
                    MessageBox.Show(rct.Left.ToString()); 
                } 
            }
        }

        private void button1_Click(object sender, EventArgs e)
        {
            th.Start();
        }

    }
...
Рейтинг: 0 / 0
Момент отлова
    #36435999
GorloPavel
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ken@tGorloPavel,

Всё украдено до вас

Спасибо. Но к сожалению это не то что мне нужно. Данный пример использует компонент MS RDP. Мне необходимо использовать свой алгоритм получения(экрана) изображения. И в моей программе не нужно закрывать сеанс пользователя(как в Radmin).
...
Рейтинг: 0 / 0
Момент отлова
    #36436056
Arm79
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
GorloPavel,

То есть если заменить GetWindowDC на GetDC, у вас не работает? GetWindowDC -немного другая область применения.
...
Рейтинг: 0 / 0
Момент отлова
    #36436131
GorloPavel
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Arm79,

Результат GetDC куда передавать? В GetUpdateRect? Ведь там HandleRef. Есть перегруженый с IntPtr, но я не могу понять как получить IntPtr RECT ведь его мне надо передать вторым параметром в функцию. Может я не правильно мыслю? Помогите пожалуйста, если это возможно. Желательно кодом. Спасибо.
...
Рейтинг: 0 / 0
Момент отлова
    #36440681
GorloPavel
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
???
...
Рейтинг: 0 / 0
Момент отлова
    #36441571
Arm79
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
посмотрите статью
вот еще получение скриншотов на Delphi :

касаемо структур:
Код: plaintext
1.
2.
3.
IntPtr Rect = Marshal.AllocHGlobal(Marshal.SizeOf(_rect_struc));
Marshal.StructureToPtr(_rect_struc, Rect, false);
var _rect_struc2= (RECT) Marshal.PtrToStructure(Rect, typeof(RECT));
Marshal.FreeHGlobal(Rect);
...
Рейтинг: 0 / 0
Момент отлова
    #36441595
Arm79
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вот еще
И еще

может быть для обработки, кроме хендлов, нужно еще BitBlt присобачить

За эти дни можно было легко нарыть еще кучу ссылок...
...
Рейтинг: 0 / 0
Момент отлова
    #36444418
GorloPavel
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Большое спасибо за ссылки. К сожалению ничего не получается. Получилось отлавливать момент перерисовки самого окна формы. Пришлось переопределить WndProc и отлавливать момент перерисовки:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
        [DllImport("user32.dll")]
        static extern bool GetUpdateRect(IntPtr hWnd, ref RECT lpRect, bool bErase);
       
        <....................>
        
        protected override void WndProc(ref Message m)
        {
            if (m.Msg == WM_PAINT)
            {
                if (!GetUpdateRect(desktopDC, ref rct, false)){return;}
                base.WndProc(ref m);
                MessageBox.Show(rct.Bottom.ToString()+":"+rct.Left.ToString()+":"+rct.Right.ToString());
            }
            else
            {

                base.WndProc(ref m); 

            }
            
        }
Это работает только тогда когда я меняю размер формы. Если я что-нибудь рисую на форме то все глухо... Отсюда вопрос. Как отлавливать момент перерисовки в самом окне и как отловить момент перерисовки окна рабочего стола("монитора") и внутри окна. Необходимо просто получить координаты изменившейся области изображения на экране.
...
Рейтинг: 0 / 0
Период между сообщениями больше года.
Момент отлова
    #38549554
Spaun91
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Хочу спросить у автора, получилось ли это сделать ?

Просто у меня сейчас такая же проблема ) пишу наподобие программу ) и ломаю голову как получить изменения на экране.
В общем если сможете ответить, напишите мне, буду ждать! )

Или даже на почту Spaun1991t@mail.ru
...
Рейтинг: 0 / 0
Момент отлова
    #38550241
Фотография D129
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Spaun91пишу наподобие программу

А что это? Экранный шпион?
...
Рейтинг: 0 / 0
Момент отлова
    #38550644
Spaun91
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Нет, это в планах учёбы состоит.
...
Рейтинг: 0 / 0
Момент отлова
    #38550687
Фотография D129
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Spaun91Нет, это в планах учёбы состоит.
Заранее извиняюсь за подрыв мотивации и авторитета преподавателей,
но удержаться не могу.
:-/

А чему-нибудь полезному, типа отображения на форме двух связанных таблиц они вас поучить не могут?
Сама идея окошек - что соседним окнам абсолютно паралельно, что происходит в других окнах и тем более на экране как таковом...
Где может пригодиться умение отслеживать изменения экрана - я просто не представляю.
Даже шпион и то не получится так сделать....
Экран меняют часы, скринсейвер, автоматическая смена картинки на работчем столе, открытое окно браузера и много еще чего....
:-\

Отпад, короче...

:-)
...
Рейтинг: 0 / 0
25 сообщений из 37, страница 1 из 2
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / Момент отлова
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]