Получить изображение окна

Программирование на Visual Basic, главный форум. Обсуждение тем программирования на VB 1—6.
Даже если вы плохо разбираетесь в VB и программировании вообще — тут вам помогут. В разумных пределах, конечно.
Правила форума
Темы, в которых будет сначала написано «что нужно сделать», а затем просьба «помогите», будут закрыты.
Читайте требования к создаваемым темам.
alibek
Большой Человек
Большой Человек
 
Сообщения: 14205
Зарегистрирован: 19.04.2002 (Пт) 11:40
Откуда: Russia

Получить изображение окна

Сообщение alibek » 29.01.2009 (Чт) 22:51

Вот такая задача появилась, необходимо получить изображение окна и отобразить его в произвольном месте экрана. Окно обычное, не оверлей. Однако окно может быть закрыто другими окнами, может быть свернуто, выведено за пределы экрана и т.п.
Конечная цель? Имеется рабочее место оператора с двумя мониторами, один из которых повернут к клиентам, чтобы они могли видеть действия оператора. При этом клиентам не обязательно (а порой и нежелательно) видеть рабочий стол оператора, оптимально было бы, чтобы на втором мониторе отображались окна только одной программы, даже если эта программа в настоящий момент неактивна и перекрыта окнами других программ.
Какие могут быть подводные камни?
Lasciate ogni speranza, voi ch'entrate.

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Re: Получить изображение окна

Сообщение Хакер » 29.01.2009 (Чт) 23:04

А что за программа? Или более конкретно: в её окне в процессе работы возникают какие-то изменения, к которым пользователь (оператор) не имеет никакого отношения (например, посмтроение графика)?
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

alibek
Большой Человек
Большой Человек
 
Сообщения: 14205
Зарегистрирован: 19.04.2002 (Пт) 11:40
Откуда: Russia

Re: Получить изображение окна

Сообщение alibek » 29.01.2009 (Чт) 23:14

Да. Оператор вводит некоторые заявки, которые помещаются в очередь. Программа, в свою очередь, связывается с сервером и постепенно обрабатывает заявки в очереди, при этом изменения статуса заявок отображается в строке статуса и в боковой информационной панели.
Lasciate ogni speranza, voi ch'entrate.

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Re: Получить изображение окна

Сообщение Хакер » 29.01.2009 (Чт) 23:42

Так ты уже полностью определился с тем, как получать изображение, и теперь просто спрашиваешь, какие грабли могут встретиться на пути, или же ты собственно спрашиваешь, как получить изображение в таком случае?
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

tyomitch
Пользователь #1352
Пользователь #1352
Аватара пользователя
 
Сообщения: 12822
Зарегистрирован: 20.10.2002 (Вс) 17:02
Откуда: חיפה

Re: Получить изображение окна

Сообщение tyomitch » 30.01.2009 (Пт) 0:15

Есть предложение решить задачу без программирования.
Например, чтобы программа выполнялась на отдельном компе, чей монитор повёрнут клиентам; а оператор чтобы подключался каким-нить ремот-админом, и сколько угодно сворачивал и деактивировал это ремот-админье окно.
Изображение

Viper
Артефакт VBStreets
Артефакт VBStreets
Аватара пользователя
 
Сообщения: 4394
Зарегистрирован: 12.04.2005 (Вт) 17:50
Откуда: Н.Новгород

Re: Получить изображение окна

Сообщение Viper » 30.01.2009 (Пт) 8:03

У меня смутное ощущение, что ровно такая же задача обсуждалась где-то на форуме пару лет назад.
Весь мир матрица, а мы в нем потоки байтов!

Денис
Доктор VB наук
Доктор VB наук
Аватара пользователя
 
Сообщения: 2734
Зарегистрирован: 07.11.2006 (Вт) 13:55
Откуда: Ейск, Краснодарский край

Re: Получить изображение окна

Сообщение Денис » 30.01.2009 (Пт) 8:56

tyomitch писал(а):Есть предложение решить задачу без программирования.

Предложу еще вариант: Компьютер с двумя мониторами. Один монитор у оператора, второй повернут к клиентам, на нем развернуто необходимое окно.
Программирование — богоизбранная дисциплина! Если бог и есть, то вселенную он скомпилировал, не иначе.

alibek
Большой Человек
Большой Человек
 
Сообщения: 14205
Зарегистрирован: 19.04.2002 (Пт) 11:40
Откуда: Russia

Re: Получить изображение окна

Сообщение alibek » 30.01.2009 (Пт) 8:59

Хакер писал(а):Так ты уже полностью определился с тем, как получать изображение, и теперь просто спрашиваешь, какие грабли могут встретиться на пути, или же ты собственно спрашиваешь, как получить изображение в таком случае?

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

tyomitch, сейчас оно так и решается. И если задача окажется слишком хлопотной, так и останется.
Lasciate ogni speranza, voi ch'entrate.

alibek
Большой Человек
Большой Человек
 
Сообщения: 14205
Зарегистрирован: 19.04.2002 (Пт) 11:40
Откуда: Russia

Re: Получить изображение окна

Сообщение alibek » 30.01.2009 (Пт) 8:59

Денис писал(а):Предложу еще вариант: Компьютер с двумя мониторами. Один монитор у оператора, второй повернут к клиентам, на нем развернуто необходимое окно.

После чего руководитель пишет по ICQ оператору какое-то сообщение и во всплывающем окошке клиенты видят то, что для них совсем не предназначено.
Lasciate ogni speranza, voi ch'entrate.

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Re: Получить изображение окна

Сообщение Хакер » 30.01.2009 (Пт) 10:56

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


Вот тут начинается интересное. Система шлёт окну эти уведомления (WM_PAINT) тогда, когда считает нужным. При этом четко сказано (в MSDN), что никто, кроме системы не имеет права слать это сообщение какому-либо окну. В принципе, слать можно и оно даже работает (иногда, например с RichEdit-ом)

Дело в том, что WindowProc при обработке WM_PAINT вызывает BeginPaint/EndPaint и при этом получает специальную структуру, в которой содержится всякая информация (в частности, hdc, на котором надо рисовать)

Обычно не важно, какой hdc, тот, который пришёл в wParam, или тот, который содержится в PAINTSTRUCT'е использовать (но предпочтительнее всё-же последний), потому что они совпадают. Но в твоём случае (когда ты сам будет слать WM_PAINT), в wParam будет одно, а BeginPaint вернёт совершенно другое (или вообще выполнится с ошибкой). Поэтому, результат вобщем случае непредсказуем.

С другой стороны, когда инвалидируется какой-то регион, он добавляется к региону отсечения. Поэтому при перерисовке окна фактически обновляется только та часть окна, которая была инвалидирована. У тебя же непонятно, каким будет регион отсечения. Если он будет нулевым, то ничего вообще не произойдёт в результате отправки WM_PAINT, если же он будет "на всё окно", то последнее заметно моргнёт при перерисовке (особенно, если там сложная графика). Т.е. если слать с достаточно большой частотой эти сообщения, то окно (очень возможно), будет с такой же частотой моргать, что вряд ли понравится клиенту.

С третьей стороны, логика отрисовки окна может быть такой, что она ещё и сама проверяет, есть ли смысл делать перерисовку. Т.е. например, если окно могут свёрнуто, то оно может отказаться перерисовываться вообще.
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

tyomitch
Пользователь #1352
Пользователь #1352
Аватара пользователя
 
Сообщения: 12822
Зарегистрирован: 20.10.2002 (Вс) 17:02
Откуда: חיפה

Re: Получить изображение окна

Сообщение tyomitch » 30.01.2009 (Пт) 12:03

У меня когда-то была затея: взять clock.exe из NT3.1 (который отрисовывается симпатичными маленькими часиками, когда свёрнутый) и заставить отрисовываться на мою форму.
Ничего не удалось достичь. Даже если подсунуть ему в отрисовывалку свой DC, то ничего не идёт: hDC-то локальные в каждом процессе.
Изображение

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Re: Получить изображение окна

Сообщение Хакер » 30.01.2009 (Пт) 13:55

tyomitch писал(а): Даже если подсунуть ему в отрисовывалку свой DC, то ничего не идёт: hDC-то локальные в каждом процессе.

Это не так страшно, можно ведь создать окно-"зеркало" (и его DC) прямо из самого процесса, которому принадлежит окно-оригинал.
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

tyomitch
Пользователь #1352
Пользователь #1352
Аватара пользователя
 
Сообщения: 12822
Зарегистрирован: 20.10.2002 (Вс) 17:02
Откуда: חיפה

Re: Получить изображение окна

Сообщение tyomitch » 30.01.2009 (Пт) 13:59

А как перекачивать картинку из одного процесса в другой, ты тоже продумал?
Сериализацией в байтовый массив? :roll:
Изображение

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Re: Получить изображение окна

Сообщение Хакер » 30.01.2009 (Пт) 14:00

Зачем два процесса?
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

tyomitch
Пользователь #1352
Пользователь #1352
Аватара пользователя
 
Сообщения: 12822
Зарегистрирован: 20.10.2002 (Вс) 17:02
Откуда: חיפה

Re: Получить изображение окна

Сообщение tyomitch » 30.01.2009 (Пт) 14:04

понял идею.

имхо ещё более суровый оверкилл, чем два компа и ремотадмин
Изображение

Mikle
Изобретатель велосипедов
Изобретатель велосипедов
Аватара пользователя
 
Сообщения: 4148
Зарегистрирован: 25.03.2003 (Вт) 14:02
Откуда: Туапсе

Re: Получить изображение окна

Сообщение Mikle » 30.01.2009 (Пт) 14:56

Не понятно главное - программа, окно которой нужно дублировать на второй монитор, своя? Исходники доступны? Или это некая абстрактная бухгалтерская программа.
В первом случае все просто, так что я думаю, что речь именно про второй случай. А тут, боюсь, однозначного решения не найти, ведь как ведет себя программа, когда она свернута, зависит от фантазии программиста, ее сделавшего. Например вполне может выйти, что проверяется состояние окна, и для свернутого визуальные контролы не обновляются, или обновление происходит не по событию изменения информации, а по таймеру (может быть удобно, если информация идет малыми порциями сотни раз в секунду).

alibek
Большой Человек
Большой Человек
 
Сообщения: 14205
Зарегистрирован: 19.04.2002 (Пт) 11:40
Откуда: Russia

Re: Получить изображение окна

Сообщение alibek » 30.01.2009 (Пт) 15:59

Mikle писал(а):Не понятно главное - программа, окно которой нужно дублировать на второй монитор, своя? Исходники доступны? Или это некая абстрактная бухгалтерская программа.

Если бы это была своя программа, вопрос бы не возник.
Нет, это платежный терминал.
Lasciate ogni speranza, voi ch'entrate.

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Re: Получить изображение окна

Сообщение Хакер » 30.01.2009 (Пт) 16:03

Так а чем вариант, предложенный Денисом отличается от твоего? Т.е. почему у него попап ICQ появится, а у тебя — нет?
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

alibek
Большой Человек
Большой Человек
 
Сообщения: 14205
Зарегистрирован: 19.04.2002 (Пт) 11:40
Откуда: Russia

Re: Получить изображение окна

Сообщение alibek » 30.01.2009 (Пт) 16:13

А откуда в моем варианте возьмется всплывающее окно ICQ?
Lasciate ogni speranza, voi ch'entrate.

visitor
Новичок
Новичок
 
Сообщения: 25
Зарегистрирован: 08.10.2008 (Ср) 1:52

Re: Получить изображение окна

Сообщение visitor » 04.02.2009 (Ср) 22:52

Хакер верно мыслит! но вместо WM_PAINT окну надо послать WM_PRINT с уканазнием в параметрах хендла своего (созданного ранее совместимого DC) - Все окно, будь оно перекрыто или нет - отрисует себя на этом DC.
MSDN:
The WM_PRINT message is sent to a window to request that it draw itself in the specified device context, most commonly in a printer device context.
A window receives this message through its WindowProc function.


Код: Выделить всё

LRESULT CALLBACK WindowProc(
  HWND hwnd,       // handle to window
  UINT uMsg,       // WM_PRINT
  WPARAM wParam,   // [b]handle to DC (HDC)[/b]
  LPARAM lParam    // drawing options
);
Parameters
[b]wParam
Handle to the device context to draw in. [/b]
lParam
Specifies the drawing options. This parameter can be one or more of the following values. Value Meaning
PRF_CHECKVISIBLE Draws the window only if it is visible.
PRF_CHILDREN Draws all visible children windows.
PRF_CLIENT Draws the client area of the window.
PRF_ERASEBKGND Erases the background before drawing the window.
PRF_NONCLIENT Draws the nonclient area of the window.
PRF_OWNED


Описания этого приема раньше были широко доступны - попробуй погуглить по WM_PRINT

tyomitch
Пользователь #1352
Пользователь #1352
Аватара пользователя
 
Сообщения: 12822
Зарегистрирован: 20.10.2002 (Вс) 17:02
Откуда: חיפה

Re: Получить изображение окна

Сообщение tyomitch » 04.02.2009 (Ср) 23:23

Поколениями проверено, что далеко не все окна реализуют WM_PRINT.
Например, VB-контролы емнип не реализуют.
Изображение

visitor
Новичок
Новичок
 
Сообщения: 25
Зарегистрирован: 08.10.2008 (Ср) 1:52

Re: Получить изображение окна

Сообщение visitor » 05.02.2009 (Чт) 3:55

tyomitch писал(а):Поколениями проверено, что далеко не все окна реализуют WM_PRINT.
Например, VB-контролы емнип не реализуют.

Да, абсолютно прав. Универсального решения я не встречал. Вот что есть интересного
http://www.fengyuan.com/article/wmprint.html

alibek
Большой Человек
Большой Человек
 
Сообщения: 14205
Зарегистрирован: 19.04.2002 (Пт) 11:40
Откуда: Russia

Re: Получить изображение окна

Сообщение alibek » 05.02.2009 (Чт) 8:51

Да, интересно. Посмотрим.
Lasciate ogni speranza, voi ch'entrate.


Вернуться в Visual Basic 1–6

Кто сейчас на конференции

Сейчас этот форум просматривают: AhrefsBot и гости: 41

    TopList  
cron