powered by simpleCommunicator - 2.0.56     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / Момент отлова
37 сообщений из 37, показаны все 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
Момент отлова
    #38550694
Arm79
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
D129Где может пригодиться умение отслеживать изменения экрана
1) RDP, Radmin, Team View.
2) Скрытое протоколирование работы
...
Рейтинг: 0 / 0
Момент отлова
    #38550860
Фотография Antonariy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Arm79D129Где может пригодиться умение отслеживать изменения экрана
1) RDP, Radmin, Team View.
2) Скрытое протоколирование работыВсе мимо.

RDP отслеживает и транслирует вызовы GDI-функций, а Radmin и TV скриншотят с определенной частотой весь экран, xor'ят с предыдущим скриншотом, и отправляют изменения.
...
Рейтинг: 0 / 0
Момент отлова
    #38550863
Arm79
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
что мимо то? какая разница, каким образом? факт остается фактом - изменения в отображении транслируются всякими удаленными клиентами.

А уж кто как делает - дело квалификации.
...
Рейтинг: 0 / 0
Момент отлова
    #38550974
Фотография D129
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Arm79А уж кто как делает - дело квалификации.
Ну вот, видите, тот кто Team View писал - уже преподает.
:-))))
...
Рейтинг: 0 / 0
Момент отлова
    #38551129
Spaun91
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Отвечу немножко по другому, саму идею я выбрал в качестве дипломной работы т.к она мне интересна.
...
Рейтинг: 0 / 0
Момент отлова
    #38551712
Фотография D129
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Spaun91Отвечу немножко по другому, саму идею я выбрал в качестве дипломной работы т.к она мне интересна.
Я бы поискал API у TeamView (или у RDP)
:-)

Все уже придумано до нас, и уметь это использовать - важнее велосипедостроения.
Ну такое у меня сугубо практическое мнение сложилось.
...
Рейтинг: 0 / 0
Момент отлова
    #38551742
Фотография _=ДОБРЫНЯ=_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
D129Я бы поискал API у TeamView

Что Вы имеете ввиду? можно ссылочку для понимания?
...
Рейтинг: 0 / 0
Момент отлова
    #38551785
Фотография D129
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
_=ДОБРЫНЯ=_D129Я бы поискал API у TeamView

Что Вы имеете ввиду? можно ссылочку для понимания?
Да вот, хотябы для начала

Во всех серьезных компонетах (Excel, Word, FineReader итп) всегда дается разработчиками какой-нибудь способ взаимодействовать с ними программно.
Управлять или использовать их функции из посторонней аппликации.

Что тут советовали - перехват потока на видеокарту? Ага. Как раз к пенсии закончите. :-)

А используя готовую (специализированную - что особенно ценно) обертку над всеми вызовами более низкого уровня - вполне в разумные сроки.

Кроме того, подобное решение совершенно лигитимно, эти компоненты никогда из системы не будут исключены, и существуют они именно для подобного.
...
Рейтинг: 0 / 0
Момент отлова
    #38551811
Фотография Antonariy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
D129Что тут советовали - перехват потока на видеокарту? Ага. Как раз к пенсии закончите. :-)Создатели radmin'а и TV уже на пенсии что ли? Кстати, автор радмина это один человек.

DirectX решает, очень просто и быстро по сравнению с GDI, всего-то нужно сделать "скриншот" видеопамяти.
"Перехват потока" это что-то из области мелиорации.
...
Рейтинг: 0 / 0
Момент отлова
    #38551893
Фотография D129
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Antonariy Кстати, автор радмина это один человек.

DirectX решает, очень просто и быстро по сравнению с GDI, всего-то нужно сделать "скриншот" видеопамяти.



Но этот один человек ( википедия некстати его имя умалчивает или это не тот RDP? )не за месяц сделал, и вообще сделал потому, что "стоял на плечах титанов". То есть знал как использовать уже имеющееся.


Не думаю, что с пенсией я так уж преувеличил - если начать писать с достаточно низкого уровня. :-)
...
Рейтинг: 0 / 0
Момент отлова
    #38551954
Фотография Antonariy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
D129, внимательнее :)

Не RDP, а Radmin.

Remote Administrator разработан Дмитрием Зноско в 1999 году. В настоящее время Дмитрий Зноско является единственным владельцем и генеральным директором компании «Фаматек».
...
Рейтинг: 0 / 0
Момент отлова
    #38552005
Lelouch
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
...
Рейтинг: 0 / 0
37 сообщений из 37, показаны все 2 страниц
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / Момент отлова
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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