Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > .NET Frameworks (точка нет фреймворки) > C# (си шарп)
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 11.04.2014, 20:44   #31
SPLER
Пользователь
 
Регистрация: 15.02.2014
Сообщений: 53
По умолчанию

nedel, я видимо не так выразился, если сворачивать окно программы (своей, а не той, с которой делаем скриншот) тогда потом останавливается, а по поводу того что PrintWindow не делает скриншота со свернутого окна, я в курсе.
SPLER вне форума Ответить с цитированием
Старый 11.04.2014, 21:26   #32
SPLER
Пользователь
 
Регистрация: 15.02.2014
Сообщений: 53
По умолчанию

В общем, еще не раз перепробовав все варианты, остановился на варианте WorldMaster'a, работает при любой задержке, свернута ли форма или нет, поток не перестает работать, вот код:
Код:
private void button1_Click(object sender, EventArgs e)
        {
            if (!BW_handle_update.IsBusy) BW_handle_update.RunWorkerAsync();
            if (!backgroundWorker2.IsBusy) backgroundWorker2.RunWorkerAsync();
        }

        private void backgroundWorker2_DoWork(object sender, DoWorkEventArgs e)
        {
            while (true)
            {
                using (Graphics g = Graphics.FromHwnd(mHandle))
                using (Bitmap bmp = new Bitmap(pictureBox1.Width, pictureBox1.Height, g))
                using (Graphics memoryGraphics = Graphics.FromImage(bmp))
                {
                    while (true)
                    {
                        i++;
                        IntPtr dc = memoryGraphics.GetHdc();
                        PrintWindow(mHandle, dc, 0x1);
                        pictureBox1.Image = bmp;
                        memoryGraphics.ReleaseHdc(dc);
                        Thread.Sleep(TimeSpan.FromMilliseconds(10));
                        this.Invoke(new MethodInvoker(() => this.Text = i.ToString()));
                    }
                }
            }
        }

        private void BW_handle_update_DoWork(object sender, DoWorkEventArgs e)
        {
            while (true)
            {
                Process[] pL = Process.GetProcesses();
                foreach (Process mProc in pL)
                {
                    if (mProc.ProcessName == "MyProcess")
                    {
                        ProcessID = mProc.Id;
                        mHandle = mProc.MainWindowHandle;
                        break;
                    }
                }
                //Добавил, так как, при двойном клике на заголовок формы, бывает останавливается backgroundWorker2.
                if (!backgroundWorker2.IsBusy) backgroundWorker2.RunWorkerAsync();
            }
        }
Единственная беда, это если pictureBox привязана к краям формы, при растягивании формы, бывает краш, а бывает и не бывает. Вот такой парадокс. В общем если не трогать размеры pictureBox, то работает прекрасно.
P.s. Переменную "i" сделал для того что бы посмотреть, продолжает ли поток работу в свернутом режиме формы.

Код:
private void button1_Click(object sender, EventArgs e)
        {
            if (!bw_handle_update.IsBusy) bw_handle_update.RunWorkerAsync();
            if (!backgroundWorker2.IsBusy) backgroundWorker2.RunWorkerAsync();
        }

        private void backgroundWorker2_DoWork(object sender, DoWorkEventArgs e)
        {
            while (true)
            {
                i++;
                using (Graphics g = Graphics.FromHwnd(mHandle))
                {
                    Bitmap bmp = new Bitmap(pictureBox1.Width, pictureBox1.Height, g);
                    using (Graphics memoryGraphics = Graphics.FromImage(bmp))
                    {
                        IntPtr dc = memoryGraphics.GetHdc();
                        PrintWindow(mHandle, dc, 0x1);
                        memoryGraphics.ReleaseHdc(dc);
                        SetImage(bmp);
                    }
                }
                this.Invoke(new MethodInvoker(() => this.Text = i.ToString()));
                Thread.Sleep(TimeSpan.FromMilliseconds(10));
            }
        }

        void SetImage(Bitmap bmp)
        {
            if (pictureBox1.InvokeRequired)
            {
                pictureBox1.Invoke(new Action<Bitmap>(SetImage), bmp);
                return;
            }
            if (pictureBox1.Image != null)
            {
                pictureBox1.Image.Dispose();
            }
            pictureBox1.Image = bmp;
        }

        private void bw_handle_update_DoWork(object sender, DoWorkEventArgs e)
        {
            while (true)
            {
                Process[] pL = Process.GetProcesses();
                foreach (Process mProc in pL)
                {
                    if (mProc.ProcessName == "MyProcess")
                    {
                        ProcessID = mProc.Id;
                        mHandle = mProc.MainWindowHandle;
                        break;
                    }
                }
                Thread.Sleep(TimeSpan.FromMilliseconds(10));
            }
        }
Второй вариант, в 2 раза меньше грузит ЦП, однако у него проблема, озвучена была, но повторюсь, при сворачивании формы, поток останавливается.

Последний раз редактировалось SPLER; 11.04.2014 в 22:00. Причина: Правка
SPLER вне форума Ответить с цитированием
Старый 12.04.2014, 10:31   #33
WorldMaster
Старожил
 
Аватар для WorldMaster
 
Регистрация: 25.08.2011
Сообщений: 2,841
По умолчанию

а зачем вам при сворачивании формы следить?
Может вместо воркеров использовать обычный поток?

А чтобы при растягивании не вылетало блокируйте изменение размеров формы в момент работы функции.
Skype - wmaster_s E-Mail - WorldMasters@gmail.com
Работаем по 3 критериям - быстро, качественно, недорого. Заказчик выбирает любые два.
WorldMaster вне форума Ответить с цитированием
Старый 12.04.2014, 12:18   #34
SPLER
Пользователь
 
Регистрация: 15.02.2014
Сообщений: 53
По умолчанию

Цитата:
а зачем вам при сворачивании формы следить?
Логичный вопрос. Но, если же планируется вводить какую либо реакцию на изображение, т.е. бить на байты, или же банально, сканирование пикселя, постоянное, то это очень бы пригодилось. Хотя в одном из первых Ваших примеров, есть решение этой проблемы, правда тогда изображение в pictureBox не отображается, но как Вы верно подметили, смысла то и нет в его отображении при таком развитии событий.
По поводу обычных потоков, на сколько знаю (могу ошибаться) созданный поток можно остановить, но вот возобновить его работу нельзя. Хотя по этому поводу слышал разные мнения, кто то говорит что можно, кто то говорит что нет. Поэтому поищу еще информацию на том же мсдн. Честно говоря, не вникал в подробности отличия обычного потока от воркера, а надо бы, исправлюсь.
SPLER вне форума Ответить с цитированием
Старый 12.04.2014, 12:42   #35
SPLER
Пользователь
 
Регистрация: 15.02.2014
Сообщений: 53
По умолчанию

Почитав мсдн, вывод: поток можно приостановить и продолжить, методами Suspend и Resume, но тот же мсдн говорит, что эти методы устарели.
SPLER вне форума Ответить с цитированием
Старый 12.04.2014, 15:45   #36
WorldMaster
Старожил
 
Аватар для WorldMaster
 
Регистрация: 25.08.2011
Сообщений: 2,841
По умолчанию

Цитата:
Сообщение от SPLER Посмотреть сообщение
Почитав мсдн, вывод: поток можно приостановить и продолжить, методами Suspend и Resume, но тот же мсдн говорит, что эти методы устарели.
Да вам по сути обычного таймера хватит. Он не останавливается.
Skype - wmaster_s E-Mail - WorldMasters@gmail.com
Работаем по 3 критериям - быстро, качественно, недорого. Заказчик выбирает любые два.
WorldMaster вне форума Ответить с цитированием
Старый 12.04.2014, 17:00   #37
SPLER
Пользователь
 
Регистрация: 15.02.2014
Сообщений: 53
По умолчанию

На сколько знаю, таймер не отдельный поток, точнее как, если в том же таймере (в функции тика) добавить слип на минуту к примеру (это извращение, понимаю, но все же) то и форма повиснит, а с ней все остальное. Но, я все же опробовал с таймером, спасибо Вам, и нашел причину остановки воркера, она заключается в том, что при сворачивании формы, Bitmap bmp = new Bitmap(pictureBox1.Width, pictureBox1.Height, g); параметры помеченные красным, становятся не допустимыми, т.е. если установить фикс. значение, например 100, 100, тогда все в норме, поток продолжает работу, но как я понял, нет перерисовки в pictureBox, и опять же, как Вы, WorldMaster, верно подметили, что и необходимости такой то и нет. В общем проблема решена целиком и полностью, спасибо большое всем, принявшим участие в ее решении.
SPLER вне форума Ответить с цитированием
Старый 12.04.2014, 17:37   #38
WorldMaster
Старожил
 
Аватар для WorldMaster
 
Регистрация: 25.08.2011
Сообщений: 2,841
По умолчанию

Цитата:
Сообщение от SPLER Посмотреть сообщение
На сколько знаю, таймер не отдельный поток, точнее как, если в том же таймере (в функции тика) добавить слип на минуту к примеру (это извращение, понимаю, но все же)
В таймере не зачем ставить слип. надо просто интервал сделать нужный и все.
Skype - wmaster_s E-Mail - WorldMasters@gmail.com
Работаем по 3 критериям - быстро, качественно, недорого. Заказчик выбирает любые два.
WorldMaster вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Скрин активного окна GrabbeR Общие вопросы Delphi 3 21.05.2012 15:28
определение активного окна DeDoK Общие вопросы Delphi 3 13.12.2010 19:07
Confirm при закрытии активного окна Jensi JavaScript, Ajax 4 17.08.2009 19:06
Поиск активного окна Arigato Win Api 5 22.11.2008 18:32