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

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

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


Донат для форума - использовать для поднятия настроения себе и модераторам

А ещё здесь можно купить рекламу за 25 тыс руб в месяц! ) пишите сюда - alarforum@yandex.ru

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

icq: 359393755
По умолчанию

Да все работает .. собрал проект запустил и все .. наблюдаю за окном чужим. Но вот если окно свернуть за которым следим то в пиктюрбокс чернота выводится. так что в этом у вас и проблема наверное.
__________________
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
Репутация: 10
По умолчанию

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

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

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

icq: 359393755
По умолчанию

Цитата:
Сообщение от 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
Репутация: 10
По умолчанию

Цитата:
в 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,306
Репутация: 705

icq: 359393755
По умолчанию

Цитата:
Сообщение от 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
Репутация: 10
По умолчанию

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

Ну еще один нюанс 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,306
Репутация: 705

icq: 359393755
По умолчанию

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

Код:
...
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
Репутация: 10
По умолчанию

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
Репутация: 10
По умолчанию

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

Опции темы

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.

Быстрый переход

Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Скрин активного окна 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


13:42.


Powered by vBulletin® Version 3.8.11
Copyright ©2000 - 2019, Jelsoft Enterprises Ltd.