Форум программистов
 
О проблемах, например, с регистрацией пишите сюда - alarforum@yandex.ru, проверяйте папку спам! Обязательно пройдите активизацию e-mail, а тут можно восстановить пароль.

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

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

Здесь нужно купить рекламу за 20 тыс руб в месяц! ) пишите сюда - alarforum@yandex.ru
Без учёта ботов - 20000 человек в день, 350000 в месяц.

Ответ
 
Опции темы
Старый 11.04.2014, 15:29   #21
WorldMaster
Старожил
 
Аватар для WorldMaster
 
Регистрация: 25.08.2011
Сообщений: 2,526
По умолчанию

Да все работает .. собрал проект запустил и все .. наблюдаю за окном чужим. Но вот если окно свернуть за которым следим то в пиктюрбокс чернота выводится. так что в этом у вас и проблема наверное.
Skype - wmaster_s E-Mail - WorldMasters@gmail.com
Работаем по 3 критериям - быстро, качественно, недорого. Заказчик выбирает любые два.

Последний раз редактировалось WorldMaster; 11.04.2014 в 15:32.
WorldMaster вне форума Ответить с цитированием
Старый 11.04.2014, 15:47   #22
SPLER
Пользователь
 
Регистрация: 15.02.2014
Сообщений: 53
По умолчанию

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

П.с. при двойном клике, редко такое случается, но бывает в основном другие варианты способствуют этому. В чем беда понять не могу.

Последний раз редактировалось SPLER; 11.04.2014 в 15:48. Причина: Дополнение
SPLER вне форума Ответить с цитированием
Старый 11.04.2014, 15:55   #23
WorldMaster
Старожил
 
Аватар для WorldMaster
 
Регистрация: 25.08.2011
Сообщений: 2,526
По умолчанию

Цитата:
Сообщение от SPLER Посмотреть сообщение
На счет сворачивания в курсе, но тут же в том и проблема, что с окном все в порядке, оно просто перекрыто, ну в прочем это не проблема. Вот что у меня происходит при быстром перетаскивании формы, или по двойному клику по заголовку формы, ну или при сворачивании, опять же, формы.

П.с. при двойном клике, редко такое случается, но бывает в основном другие варианты способствуют этому. В чем беда понять не могу.
Хэндл окна периодически меняется. Так что это надо учитывать. Создайте свойство формы mProc. По нажатию кнопки найдите процесс и сохраните его в переменной mProc;
А в отдельном потоке обновляйте
Код:
ProcessID = mProc.Id;
mHandle = mProc.MainWindowHandle;
Так должно быть постабильнее. А ось какая у вас?
Skype - wmaster_s E-Mail - WorldMasters@gmail.com
Работаем по 3 критериям - быстро, качественно, недорого. Заказчик выбирает любые два.
WorldMaster вне форума Ответить с цитированием
Старый 11.04.2014, 15:59   #24
nedel
Пользователь
 
Регистрация: 09.04.2014
Сообщений: 18
По умолчанию

Цитата:
в pictureBox1 опять отображается перечеркнутый квадрат
Это из-за того что Вы неявно вызываете bmp.Dispose().
Код:
while (true)
            {
if(pictureBox1.Image !=null)
{
pictureBox1.Image.Dispose();
pictureBox1.Image = null;
}
                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);
                    pictureBox1.Image = bmp;
                }
}
                Thread.Sleep(TimeSpan.FromMilliseconds(10));
            }
Ну и вопрос: Вам действительно нужно 100 кадров в секунду, или хватит и 20? >> Thread.Sleep(50)
nedel вне форума Ответить с цитированием
Старый 11.04.2014, 16:02   #25
WorldMaster
Старожил
 
Аватар для WorldMaster
 
Регистрация: 25.08.2011
Сообщений: 2,526
По умолчанию

Цитата:
Сообщение от nedel Посмотреть сообщение
Ну и вопрос: Вам действительно нужно 100 кадров в секунду, или хватит и 20? >> Thread.Sleep(50)
Почему не на всех машинах проявляется?

Как решение можно вынести все за пределы цикла while
а внутри оставить только
Код:
IntPtr dc = memoryGraphics.GetHdc();
PrintWindow(mHandle, dc, 0x1);
memoryGraphics.ReleaseHdc(dc);
pictureBox1.Image = bmp;
вот как то так:

Код:
private void backgroundWorker2_DoWork(object sender, DoWorkEventArgs e)
        {

            Process[] pL = Process.GetProcesses();
            foreach (Process mProc in pL)
            {
                if (mProc.ProcessName == "BitTorrent")
                {
                    ProcessID = mProc.Id;
                    mHandle = mProc.MainWindowHandle;
                    break;
                }
            }


            using (Graphics g = Graphics.FromHwnd(mHandle))
            using (Bitmap bmp = new Bitmap(pictureBox1.Width, pictureBox1.Height, g))
            using (Graphics memoryGraphics = Graphics.FromImage(bmp))
            {
                while (true)
                {
                    IntPtr dc = memoryGraphics.GetHdc();
                    PrintWindow(mHandle, dc, 0x1);
                    pictureBox1.Image = bmp;
                    memoryGraphics.ReleaseHdc(dc);
                    Thread.Sleep(TimeSpan.FromMilliseconds(40));
                }
            }
        }
Только хэндл тоже в цикл перенести надо чтоб обновлялся постоянно.
Skype - wmaster_s E-Mail - WorldMasters@gmail.com
Работаем по 3 критериям - быстро, качественно, недорого. Заказчик выбирает любые два.

Последний раз редактировалось WorldMaster; 11.04.2014 в 16:06.
WorldMaster вне форума Ответить с цитированием
Старый 11.04.2014, 16:04   #26
SPLER
Пользователь
 
Регистрация: 15.02.2014
Сообщений: 53
По умолчанию

WorldMaster, спасибо, сейчас попробую. Ось 7 х64 СП1.
nedel, спасибо и за Ваш ответ, тоже опробую. На счет 100 кадров, чуть ранее в теме написал, что поправил до 25 к\сек, т.е. Sleep(40).
SPLER вне форума Ответить с цитированием
Старый 11.04.2014, 16:27   #27
nedel
Пользователь
 
Регистрация: 09.04.2014
Сообщений: 18
По умолчанию

Ну еще один нюанс BackgroundWorker.DoWork обрабатывается в отдельном потоке, а обращаться к визуальным элементам управления можно только в потоке, в котором он был создан...
Код:
private void backgroundWorker2_DoWork(object sender, DoWorkEventArgs e)
{
...........
while (true)
            {
                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);
                }
}
                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;
        }
nedel вне форума Ответить с цитированием
Старый 11.04.2014, 16:40   #28
WorldMaster
Старожил
 
Аватар для WorldMaster
 
Регистрация: 25.08.2011
Сообщений: 2,526
По умолчанию

Попробуйте так сделать:

Код:
...
int ProcessID;
IntPtr mHandle;
Process SelectedProc;


 private void getProcessIdHandle()
        {
            Process[] pL = Process.GetProcesses();
            foreach (Process mProc in pL)
            {
                if (mProc.ProcessName == "BitTorrent")
                {
                    SelectedProc = mProc;
                    ProcessID = mProc.Id;
                    mHandle = mProc.MainWindowHandle;
                    break;
                }
            }
        }

private void backgroundWorker2_DoWork(object sender, DoWorkEventArgs e)
        {
            while (true)
            {
                using (Graphics g = Graphics.FromHwnd(mHandle))
                {
                    Bitmap bmp = new Bitmap(pictureBox1.Width, pictureBox1.Height, g);

                    using (Graphics memoryGraphics = Graphics.FromImage(bmp))
                    {
                        ProcessID = SelectedProc.Id;
                        mHandle = SelectedProc.MainWindowHandle;

                        IntPtr dc = memoryGraphics.GetHdc();
                        PrintWindow(mHandle, dc, 0x1);

                        if (this.InvokeRequired) this.Invoke(new MethodInvoker(() => { if (pictureBox1.Image != null) pictureBox1.Image.Dispose(); }));
                        else if (pictureBox1.Image != null) pictureBox1.Image.Dispose();

                        if (this.InvokeRequired) this.Invoke(new MethodInvoker(() => pictureBox1.Image = bmp));
                        else pictureBox1.Image = bmp;

                        memoryGraphics.ReleaseHdc(dc);
                        Thread.Sleep(TimeSpan.FromMilliseconds(40));
                    }
                }
            }
        }
Skype - wmaster_s E-Mail - WorldMasters@gmail.com
Работаем по 3 критериям - быстро, качественно, недорого. Заказчик выбирает любые два.
WorldMaster вне форума Ответить с цитированием
Старый 11.04.2014, 17:03   #29
SPLER
Пользователь
 
Регистрация: 15.02.2014
Сообщений: 53
По умолчанию

WorldMaster и nedel, спасибо большое за ваши варианты.
Но решил проблему ваш вариант nedel, за исключеним одного не большого но, при сворачивании формы, backgroundWorker2 прекращает свою работу, не ясно правда почему. Однако при всех остальных вариантах, при которых ранее возникала проблема, сейчас они полностью отсутствуют.
Вот код приложу на всякий случай:
Код:
public Form1()
        {
            InitializeComponent();
        }

        int ProcessID;
        IntPtr mHandle;

        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))
                {
                    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);
                    }
                }
                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));
            }
        }
П.с. WorldMaster, по вашему совету сделал второй поток, обновляющий хендл. Если я правильно Вас понял, надеюсь на это. И да, при сворачивании, останавливается только backgroundWorker2, однако bw_handle_update успешно продолжает работать.
SPLER вне форума Ответить с цитированием
Старый 11.04.2014, 18:10   #30
nedel
Пользователь
 
Регистрация: 09.04.2014
Сообщений: 18
По умолчанию

Цитата:
при сворачивании формы, backgroundWorker2 прекращает свою работу, не ясно правда почему.
PrintWindow не работает с минимизированными окнами
nedel вне форума Ответить с цитированием
Ответ

Здесь нужно купить рекламу за 20 тыс руб в месяц! ) пишите сюда - alarforum@yandex.ru
Без учёта ботов - 20000 человек в день, 350000 в месяц.

Опции темы


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


Проекты отопления, пеллетные котлы, бойлеры, радиаторы
интернет магазин respective.ru
Пеллетный котёл Emtas
котлы EMTAS