Форум программистов «Весельчак У»
  *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

  • Рекомендуем проверить настройки временной зоны в вашем профиле (страница "Внешний вид форума", пункт "Часовой пояс:").
  • У нас больше нет рассылок. Если вам приходят письма от наших бывших рассылок mail.ru и subscribe.ru, то знайте, что это не мы рассылаем.
   Начало  
Наши сайты
Помощь Поиск Календарь Почта Войти Регистрация  
 
Страниц: [1]   Вниз
  Печать  
Автор Тема: Вывод изображения сверху всех окон  (Прочитано 28914 раз)
0 Пользователей и 1 Гость смотрят эту тему.
Scorp__)
Молодой специалист

ru
Offline Offline
Пол: Мужской

« : 20-02-2006 17:38 » new

Добрый день, вопрос такой.

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

в общем встал в тупик. Если ставить глобальный хук на WM_PAINT, то там получаем хендл на окно, которому сейчас направлено сообщение. И даже если зарегестрировать callback все равно не могу понять как нарисовать изображение на своем месте.

Может быть можно как-нибудь фильтровать вывод на дисплей с помощью драйверов или kernel mode dll.

Благодарен за любые советы.
Записан

- А Вы сами-то верите в привидения?
- Конечно, нет, - ответил лектор и медленно растаял в воздухе.
Гром
Птычк. Тьфу, птычник... Вот!
Готовлюсь к пенсии

il
Offline Offline
Пол: Мужской
Бодрый птах


« Ответ #1 : 20-02-2006 17:48 » 

Хм.
В играх - дорогой, одно, в простой работе другое.
Тут как грится не все так просто.
В играх экран захвачен графикой DirectX или OpenGL. В этом случае при полноэкранном режме никакие паинты тебе не помогут. За этот случай тебе скажу только, что там идет работа напрямую с видео памятью. Поэтому ты должен подрубаться к интерфейсу граф оболочки и так накладывать изображение.

В простом варианте - когда обычный ГУИ интерфейс винды - тоже паинт по сути не причем.
Есть как бы такое расслоение. Есть окна перекрываемые, а есть нет. Тебе для вывода поверх всех необходимо просто создать окно с параметром над всеми окнами. Потом в него писать - рисовать как обычно. Позиционировать окошечко в нужное место и запретить минимизацию. макисмизацию и закрывание программы без специального на то разрешения.
Добивается простым диалогом и достаточно просто.

Записан

А птичку нашу прошу не обижать!!!
Scorp__)
Молодой специалист

ru
Offline Offline
Пол: Мужской

« Ответ #2 : 20-02-2006 18:05 » 

Гром, это я понимаю Улыбаюсь Но во-первых пока рылся в инете встретил вот такую темку http://www.relib.com/forums/thread846415.aspx

Там автор пишет, что у него для клавы такая программка, которая и делает примерно то, что мне надо.

А когда обычный ГУИ, надо же чтобы все остальные окна при этом принимали сообщения. То есть человек работает  в ворде, а изображение сверху имеется. Так что диалоговое окно не покатит. Скорее тут как раз хук нужен, с callback-ом, но говорят он тормозит (мигает все) и опять же не пойму как это сделать. Но все-таки подозреваю, что можно фильтровать на более низком уровне.   
Записан

- А Вы сами-то верите в привидения?
- Конечно, нет, - ответил лектор и медленно растаял в воздухе.
Finch
Спокойный
Администратор

il
Offline Offline
Пол: Мужской
Пролетал мимо


« Ответ #3 : 20-02-2006 18:14 » 

За Модалки и игры не ручаюсь. Создаеш окно через CreateWindowEx со стилем WS_EX_TOPMOST. Меняеш регион у своего окна через функцию SetWindowRgn. Регион делаеш под свой рисунок. Это окно винда будет сама держать в самом верху z уровня.
В принципе по твоей ссылке тоже самое предложили в первом ответе.
« Последнее редактирование: 20-02-2006 18:20 от Finch » Записан

Не будите спашяго дракона.
             Джаффар (Коша)
PooH
Глобальный модератор

ru
Offline Offline
Пол: Мужской
... и можно без хлеба!


« Ответ #4 : 20-02-2006 18:16 » 

вариант, GUI:
тебе, надо рисовать на одном и том же месте относительно десктопа? Попробуй рисовать в GetDC(0), или точнее (правильней) в GetDC(GetDesktopWindow()).  Если мне не изменяет память весь интерфейс фактически отрисовывается в окне десктопа.
Записан

Удачного всем кодинга! -=x[PooH]x=-
Finch
Спокойный
Администратор

il
Offline Offline
Пол: Мужской
Пролетал мимо


« Ответ #5 : 20-02-2006 18:19 » 

PooH, Окно десктопа имеет самый нижний z уровень. И любое окно сможет перекрыть его. Второе, как отслежтвать перерисовку десктопа?
Записан

Не будите спашяго дракона.
             Джаффар (Коша)
PooH
Глобальный модератор

ru
Offline Offline
Пол: Мужской
... и можно без хлеба!


« Ответ #6 : 20-02-2006 18:27 » 

Finch, по-моему, ты путаешь окно десктопа, и "рабочий стол", а может быть я путаю... надо пробавать, но помнится TextOut(GetDC(0),10,760,"Hello!\0",7); поверх трэя рисовалось. (1024x768)
Записан

Удачного всем кодинга! -=x[PooH]x=-
Finch
Спокойный
Администратор

il
Offline Offline
Пол: Мужской
Пролетал мимо


« Ответ #7 : 20-02-2006 18:27 » 

Чтобы избавится от Caption и бордюров нужно также применить стиль WS_POPUP.
Записан

Не будите спашяго дракона.
             Джаффар (Коша)
Scorp__)
Молодой специалист

ru
Offline Offline
Пол: Мужской

« Ответ #8 : 20-02-2006 18:48 » 

Finch, так и сделал бы и отсек все ненужное. Но изображение на самом деле распределенное, то бишь, несколько точек в разных местах экрана.

Pooh, будет перекрываться другими окошками, браузером, вордом.

Мне кажется, что есть способы фильтрации вывода, просто я их не знаю. Да и то, что в той темке описано (то есть полоска появляется и в играх) очень похоже на низкоуровневую фильтрацию, но ведь для видеодрайверов не существует фильтров по-моему... Или существуют?
 
Записан

- А Вы сами-то верите в привидения?
- Конечно, нет, - ответил лектор и медленно растаял в воздухе.
PooH
Глобальный модератор

ru
Offline Offline
Пол: Мужской
... и можно без хлеба!


« Ответ #9 : 20-02-2006 18:58 » 

Scorp__), по-моему, если переодически перерисовывать, то не будет ничем перекрываться. По-моему, контекст десктопа перекрыть нельзя, так как все окна (GUI) рисуются в нем .
Записан

Удачного всем кодинга! -=x[PooH]x=-
Finch
Спокойный
Администратор

il
Offline Offline
Пол: Мужской
Пролетал мимо


« Ответ #10 : 20-02-2006 19:27 » 

PooH, Я опробовал твой метод, только чуть доработал
Код:
HDC wdc=GetDC(0);
TextOut(wdc,300,300,"Hello!\0",7);
ReleaseDC(0,wdc);
Оно хоть и рисуется поверх всех. Но зато и затирается, при первом же движении других окон. Перерисовывать по таймеру, это не выход из положения.
Записан

Не будите спашяго дракона.
             Джаффар (Коша)
PooH
Глобальный модератор

ru
Offline Offline
Пол: Мужской
... и можно без хлеба!


« Ответ #11 : 21-02-2006 06:14 » 

Finch, конечно не выход: осталось еще отследить факт необходимости прорисовки. Этот метод только гарантирует вывод поверх всех окон. По-моему, никаким Z ордером нельзя перекрыть "Список задач" (Ctrl+Alt+Del) - а таким можно.

Осталось только (Улыбаюсь ) определить когда нужно перерисовывать, думаю тут без хука не обойтись, только я не готов сказать какого.
Записан

Удачного всем кодинга! -=x[PooH]x=-
Scorp__)
Молодой специалист

ru
Offline Offline
Пол: Мужской

« Ответ #12 : 21-02-2006 15:11 » 

Спасибо, ребята! Если все работает, то это и надо, просто не успел с утра проверить. И огромное спасибо, что проверили за меня.

Finch, тогда действительно я поставлю хук на сообщение WM_PAINT. Сейчас посмотрю как можно получить управление после выполнения стандартного обработчика. Думаю что регистрацией callback процедуры это должно решиться.
Записан

- А Вы сами-то верите в привидения?
- Конечно, нет, - ответил лектор и медленно растаял в воздухе.
Scorp__)
Молодой специалист

ru
Offline Offline
Пол: Мужской

« Ответ #13 : 22-02-2006 10:54 » 

Эээ, тут еще одна проблемка возникла. В общем хук ставиться на возврат из процедуры обработки сообщений.

Но вот все это надо почаще рефрешить, потому что цвет надо менять с течением времени, я про это забыл Жаль Может кто подскажет как сделать, чтобы WM_PAINT все время ходило
Записан

- А Вы сами-то верите в привидения?
- Конечно, нет, - ответил лектор и медленно растаял в воздухе.
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #14 : 22-02-2006 11:35 » 

Scorp__), таймер запусти и посылай сообщение по таймеру
Записан

Scorp__)
Молодой специалист

ru
Offline Offline
Пол: Мужской

« Ответ #15 : 22-02-2006 13:53 » 

По таймеру как-то не очень прилично Улыбаюсь я думал, может как-нибудь без него

Но вообще Оказалось, что цвет все-таки менять не надо, поэтому старое решение в силе Улыбаюсь
Записан

- А Вы сами-то верите в привидения?
- Конечно, нет, - ответил лектор и медленно растаял в воздухе.
Гром
Птычк. Тьфу, птычник... Вот!
Готовлюсь к пенсии

il
Offline Offline
Пол: Мужской
Бодрый птах


« Ответ #16 : 22-02-2006 14:33 » 

Scorp__), ты совсем плох в представлении что такое хук? У меня честно говоря даже как-то глаза расширились. Ты чего это?

Причем тут сообщения.
Стиль для окна всегда виден перехватит сообщения к тебе только в рамках твоего окна, остальные будут получать его как обычно. Ты б хоть смотрел как таск менеджер работает - он по умолчанию в таком стиле.

Далее - даже если ты хочешь все сообщения окон пропускать через себя - тебе это не удастся, системная очередь не даст.

Кроме того - когда хук делаются все сообщения ВСЕГДА отправляются далее владельцу, ты только обрабатываешь их раньше.

Короче ты каку то фигню спорол - чего тебе непонятно - напиши нормально, тем более, что я такое делал.
Записан

А птичку нашу прошу не обижать!!!
Гром
Птычк. Тьфу, птычник... Вот!
Готовлюсь к пенсии

il
Offline Offline
Пол: Мужской
Бодрый птах


« Ответ #17 : 22-02-2006 14:34 » 

PooH, Мля - какой Зед ордер - млин - вы собвсем. как-то даже непрятно. Стиль отменяющий стоит - хоть читайте иногда - поставь в твоем таск менеджере отмену свойства "поверх всех окон" и все перекроешь.
Записан

А птичку нашу прошу не обижать!!!
Гром
Птычк. Тьфу, птычник... Вот!
Готовлюсь к пенсии

il
Offline Offline
Пол: Мужской
Бодрый птах


« Ответ #18 : 22-02-2006 14:35 » 

Да - а потом качаем самопальную прогу, а она проц грузит на 100% - прорисовка окна по таймеру - с ума сойти, а поймать рефреш на свой собственный регион слабо?
Записан

А птичку нашу прошу не обижать!!!
Scorp__)
Молодой специалист

ru
Offline Offline
Пол: Мужской

« Ответ #19 : 22-02-2006 15:25 » 

Гром, ты чего ругаешься? Про рефреш по таймеру я и сказал, что это некузяво. Мне уже все понятно. Pooh, написал, что это рисуется с помощью hDC десктопа. Finch проверил и сказал, что действительно рисуется поверх всего, но при перерисовке окон изображение теряется.

Вывод - надо обновлять свое изображение. Когда? Когда все перерисовывается. Решение? Узнать когда приходит WM_PAINT и после его обработки тем кому оно предназначалось нарисовать то, что надо нам.  Реализация? Ставим хук типа WH_CALLWNDPROCRET. Как написано в МСДН
Installs a hook procedure that monitors messages after they have been processed by the destination window procedure. For more information, see the CallWndRetProc hook procedure.

Искомое слово выделено жирным. В процедуре хука рисуем что хотим уже сверху окон.

В моей задаче мне остались непонятны некоторые моменты, потому что ТЗ нечетко сформулировано. Но постепенно все разрешается.

Так что зря ты меня с хуком обидел Жаль

Тем более, что окно сверху в принципе не подходит в данной задаче. Надо чтобы изображение висело, его точки разбросаны по всему экрану, а в это время пользователь должен спокойно читать анекдоты в браузере или трепаться по аське. И ничто ему не должно мешать. 
« Последнее редактирование: 22-02-2006 15:31 от Scorp__) » Записан

- А Вы сами-то верите в привидения?
- Конечно, нет, - ответил лектор и медленно растаял в воздухе.
PooH
Глобальный модератор

ru
Offline Offline
Пол: Мужской
... и можно без хлеба!


« Ответ #20 : 23-02-2006 12:34 » 

PooH, Мля - какой Зед ордер - млин - вы собвсем. как-то даже непрятно. Стиль отменяющий стоит - хоть читайте иногда - поставь в твоем таск менеджере отмену свойства "поверх всех окон" и все перекроешь.

я упомянул Z-ордер только потому, что Finch сказал
Цитата
Это окно винда будет сама держать в самом верху z уровня.
, а на самом деле это не совсем так. Ибо если окон "поверх всех" будет несколько они могут друг-друга перекрывать. А винда по умолчанию "список задач" выводит действительно поверх всех, даже поверх тех, кто "поверх всех" Улыбаюсь
Записан

Удачного всем кодинга! -=x[PooH]x=-
Страниц: [1]   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines