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

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

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

Угу, только все изменившиеся квадраты сразу. А то будет поквадратно обновлять, некрасиво получится.
...
Рейтинг: 0 / 0
26.01.2010, 21:07
    #36432374
Arm79
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Момент отлова
Ну вообще в WinAPI есть такие интересные функции как GetUpdateRect & GetUpdateRgn
Можно через p/invoke сделать к ним обертку
...
Рейтинг: 0 / 0
26.01.2010, 21:09
    #36432378
Arm79
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Момент отлова
Забыл добавить еще GetDC для отлова рабочего стола
...
Рейтинг: 0 / 0
27.01.2010, 06:56
    #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
27.01.2010, 10:47
    #36432973
Arm79
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Момент отлова
1) Я не говорил про GetDesktopWindow. Было GetDC
2) В каждой функции явно пропишите Charser. Судя по типам, это фиолетово, но я всегда явно специфицирую.
...
Рейтинг: 0 / 0
27.01.2010, 13:45
    #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
28.01.2010, 09:46
    #36435250
Arm79
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Момент отлова
Смотрели сайт pinvoke.net? Там и сигнатуры правильно расписаны, и использован HandleRef

здесь
...
Рейтинг: 0 / 0
28.01.2010, 12:46
    #36435944
GorloPavel
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Момент отлова
Удалось получить область изменения окна программы. Нужно было запустить в отдельном потоке. Работает как-то странно. Срабатывает только тогда когда я изменяю размер окна, но когда я к примеру рисую что-нибудь на форме, то ничего не происходит. Так как же получить регион(прямогольник) экрана в котором произошли изменения? Не могу сообразить... Пробовал передавать в функцию хендл раб. стола(GetDesktopWindow()), но нечего не происходит... Заранее спасибо за помощь!
...
Рейтинг: 0 / 0
28.01.2010, 12:49
    #36435960
Ken@t
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Момент отлова
...
Рейтинг: 0 / 0
28.01.2010, 12:50
    #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
28.01.2010, 12:57
    #36435999
GorloPavel
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Момент отлова
Ken@tGorloPavel,

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

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

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

Результат GetDC куда передавать? В GetUpdateRect? Ведь там HandleRef. Есть перегруженый с IntPtr, но я не могу понять как получить IntPtr RECT ведь его мне надо передать вторым параметром в функцию. Может я не правильно мыслю? Помогите пожалуйста, если это возможно. Желательно кодом. Спасибо.
...
Рейтинг: 0 / 0
31.01.2010, 09:05
    #36440681
GorloPavel
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Момент отлова
???
...
Рейтинг: 0 / 0
01.02.2010, 10:40
    #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
01.02.2010, 10:50
    #36441595
Arm79
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Момент отлова
Вот еще
И еще

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

За эти дни можно было легко нарыть еще кучу ссылок...
...
Рейтинг: 0 / 0
02.02.2010, 13:33
    #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
Период между сообщениями больше года.
05.02.2014, 01:15
    #38549554
Spaun91
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Момент отлова
Хочу спросить у автора, получилось ли это сделать ?

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

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

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

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

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

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


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