Scorp__)
Молодой специалист
Offline
Пол:
|
|
« : 20-02-2006 17:38 » |
|
Добрый день, вопрос такой.
Нужно выводить сверху всех окон, в идеале даже в играх и при просмотре видео, выводить некоторое изображение, причем изображение должно располагаться на одном месте на экране.
в общем встал в тупик. Если ставить глобальный хук на WM_PAINT, то там получаем хендл на окно, которому сейчас направлено сообщение. И даже если зарегестрировать callback все равно не могу понять как нарисовать изображение на своем месте.
Может быть можно как-нибудь фильтровать вывод на дисплей с помощью драйверов или kernel mode dll.
Благодарен за любые советы.
|
|
|
Записан
|
- А Вы сами-то верите в привидения? - Конечно, нет, - ответил лектор и медленно растаял в воздухе.
|
|
|
Гром
Птычк. Тьфу, птычник... Вот!
Готовлюсь к пенсии
Offline
Пол:
Бодрый птах
|
|
« Ответ #1 : 20-02-2006 17:48 » |
|
Хм. В играх - дорогой, одно, в простой работе другое. Тут как грится не все так просто. В играх экран захвачен графикой DirectX или OpenGL. В этом случае при полноэкранном режме никакие паинты тебе не помогут. За этот случай тебе скажу только, что там идет работа напрямую с видео памятью. Поэтому ты должен подрубаться к интерфейсу граф оболочки и так накладывать изображение.
В простом варианте - когда обычный ГУИ интерфейс винды - тоже паинт по сути не причем. Есть как бы такое расслоение. Есть окна перекрываемые, а есть нет. Тебе для вывода поверх всех необходимо просто создать окно с параметром над всеми окнами. Потом в него писать - рисовать как обычно. Позиционировать окошечко в нужное место и запретить минимизацию. макисмизацию и закрывание программы без специального на то разрешения. Добивается простым диалогом и достаточно просто.
|
|
|
Записан
|
А птичку нашу прошу не обижать!!!
|
|
|
Scorp__)
Молодой специалист
Offline
Пол:
|
|
« Ответ #2 : 20-02-2006 18:05 » |
|
Гром, это я понимаю Но во-первых пока рылся в инете встретил вот такую темку http://www.relib.com/forums/thread846415.aspxТам автор пишет, что у него для клавы такая программка, которая и делает примерно то, что мне надо. А когда обычный ГУИ, надо же чтобы все остальные окна при этом принимали сообщения. То есть человек работает в ворде, а изображение сверху имеется. Так что диалоговое окно не покатит. Скорее тут как раз хук нужен, с callback-ом, но говорят он тормозит (мигает все) и опять же не пойму как это сделать. Но все-таки подозреваю, что можно фильтровать на более низком уровне.
|
|
|
Записан
|
- А Вы сами-то верите в привидения? - Конечно, нет, - ответил лектор и медленно растаял в воздухе.
|
|
|
Finch
Спокойный
Администратор
Offline
Пол:
Пролетал мимо
|
|
« Ответ #3 : 20-02-2006 18:14 » |
|
За Модалки и игры не ручаюсь. Создаеш окно через CreateWindowEx со стилем WS_EX_TOPMOST. Меняеш регион у своего окна через функцию SetWindowRgn. Регион делаеш под свой рисунок. Это окно винда будет сама держать в самом верху z уровня. В принципе по твоей ссылке тоже самое предложили в первом ответе.
|
|
« Последнее редактирование: 20-02-2006 18:20 от Finch »
|
Записан
|
Не будите спашяго дракона. Джаффар (Коша)
|
|
|
PooH
Глобальный модератор
Offline
Пол:
... и можно без хлеба!
|
|
« Ответ #4 : 20-02-2006 18:16 » |
|
вариант, GUI: тебе, надо рисовать на одном и том же месте относительно десктопа? Попробуй рисовать в GetDC(0), или точнее (правильней) в GetDC(GetDesktopWindow()). Если мне не изменяет память весь интерфейс фактически отрисовывается в окне десктопа.
|
|
|
Записан
|
Удачного всем кодинга! -=x[PooH]x=-
|
|
|
Finch
Спокойный
Администратор
Offline
Пол:
Пролетал мимо
|
|
« Ответ #5 : 20-02-2006 18:19 » |
|
PooH, Окно десктопа имеет самый нижний z уровень. И любое окно сможет перекрыть его. Второе, как отслежтвать перерисовку десктопа?
|
|
|
Записан
|
Не будите спашяго дракона. Джаффар (Коша)
|
|
|
PooH
Глобальный модератор
Offline
Пол:
... и можно без хлеба!
|
|
« Ответ #6 : 20-02-2006 18:27 » |
|
Finch, по-моему, ты путаешь окно десктопа, и "рабочий стол", а может быть я путаю... надо пробавать, но помнится TextOut(GetDC(0),10,760,"Hello!\0",7); поверх трэя рисовалось. (1024x768)
|
|
|
Записан
|
Удачного всем кодинга! -=x[PooH]x=-
|
|
|
Finch
Спокойный
Администратор
Offline
Пол:
Пролетал мимо
|
|
« Ответ #7 : 20-02-2006 18:27 » |
|
Чтобы избавится от Caption и бордюров нужно также применить стиль WS_POPUP.
|
|
|
Записан
|
Не будите спашяго дракона. Джаффар (Коша)
|
|
|
Scorp__)
Молодой специалист
Offline
Пол:
|
|
« Ответ #8 : 20-02-2006 18:48 » |
|
Finch, так и сделал бы и отсек все ненужное. Но изображение на самом деле распределенное, то бишь, несколько точек в разных местах экрана.
Pooh, будет перекрываться другими окошками, браузером, вордом.
Мне кажется, что есть способы фильтрации вывода, просто я их не знаю. Да и то, что в той темке описано (то есть полоска появляется и в играх) очень похоже на низкоуровневую фильтрацию, но ведь для видеодрайверов не существует фильтров по-моему... Или существуют?
|
|
|
Записан
|
- А Вы сами-то верите в привидения? - Конечно, нет, - ответил лектор и медленно растаял в воздухе.
|
|
|
PooH
Глобальный модератор
Offline
Пол:
... и можно без хлеба!
|
|
« Ответ #9 : 20-02-2006 18:58 » |
|
Scorp__), по-моему, если переодически перерисовывать, то не будет ничем перекрываться. По-моему, контекст десктопа перекрыть нельзя, так как все окна (GUI) рисуются в нем .
|
|
|
Записан
|
Удачного всем кодинга! -=x[PooH]x=-
|
|
|
Finch
Спокойный
Администратор
Offline
Пол:
Пролетал мимо
|
|
« Ответ #10 : 20-02-2006 19:27 » |
|
PooH, Я опробовал твой метод, только чуть доработал HDC wdc=GetDC(0); TextOut(wdc,300,300,"Hello!\0",7); ReleaseDC(0,wdc);
Оно хоть и рисуется поверх всех. Но зато и затирается, при первом же движении других окон. Перерисовывать по таймеру, это не выход из положения.
|
|
|
Записан
|
Не будите спашяго дракона. Джаффар (Коша)
|
|
|
PooH
Глобальный модератор
Offline
Пол:
... и можно без хлеба!
|
|
« Ответ #11 : 21-02-2006 06:14 » |
|
Finch, конечно не выход: осталось еще отследить факт необходимости прорисовки. Этот метод только гарантирует вывод поверх всех окон. По-моему, никаким Z ордером нельзя перекрыть "Список задач" (Ctrl+Alt+Del) - а таким можно. Осталось только ( ) определить когда нужно перерисовывать, думаю тут без хука не обойтись, только я не готов сказать какого.
|
|
|
Записан
|
Удачного всем кодинга! -=x[PooH]x=-
|
|
|
Scorp__)
Молодой специалист
Offline
Пол:
|
|
« Ответ #12 : 21-02-2006 15:11 » |
|
Спасибо, ребята! Если все работает, то это и надо, просто не успел с утра проверить. И огромное спасибо, что проверили за меня.
Finch, тогда действительно я поставлю хук на сообщение WM_PAINT. Сейчас посмотрю как можно получить управление после выполнения стандартного обработчика. Думаю что регистрацией callback процедуры это должно решиться.
|
|
|
Записан
|
- А Вы сами-то верите в привидения? - Конечно, нет, - ответил лектор и медленно растаял в воздухе.
|
|
|
Scorp__)
Молодой специалист
Offline
Пол:
|
|
« Ответ #13 : 22-02-2006 10:54 » |
|
Эээ, тут еще одна проблемка возникла. В общем хук ставиться на возврат из процедуры обработки сообщений. Но вот все это надо почаще рефрешить, потому что цвет надо менять с течением времени, я про это забыл Может кто подскажет как сделать, чтобы WM_PAINT все время ходило
|
|
|
Записан
|
- А Вы сами-то верите в привидения? - Конечно, нет, - ответил лектор и медленно растаял в воздухе.
|
|
|
Алексей++
глобальный и пушистый
Глобальный модератор
Offline
Сообщений: 13
|
|
« Ответ #14 : 22-02-2006 11:35 » |
|
Scorp__), таймер запусти и посылай сообщение по таймеру
|
|
|
Записан
|
|
|
|
Scorp__)
Молодой специалист
Offline
Пол:
|
|
« Ответ #15 : 22-02-2006 13:53 » |
|
По таймеру как-то не очень прилично я думал, может как-нибудь без него Но вообще Оказалось, что цвет все-таки менять не надо, поэтому старое решение в силе
|
|
|
Записан
|
- А Вы сами-то верите в привидения? - Конечно, нет, - ответил лектор и медленно растаял в воздухе.
|
|
|
Гром
Птычк. Тьфу, птычник... Вот!
Готовлюсь к пенсии
Offline
Пол:
Бодрый птах
|
|
« Ответ #16 : 22-02-2006 14:33 » |
|
Scorp__), ты совсем плох в представлении что такое хук? У меня честно говоря даже как-то глаза расширились. Ты чего это?
Причем тут сообщения. Стиль для окна всегда виден перехватит сообщения к тебе только в рамках твоего окна, остальные будут получать его как обычно. Ты б хоть смотрел как таск менеджер работает - он по умолчанию в таком стиле.
Далее - даже если ты хочешь все сообщения окон пропускать через себя - тебе это не удастся, системная очередь не даст.
Кроме того - когда хук делаются все сообщения ВСЕГДА отправляются далее владельцу, ты только обрабатываешь их раньше.
Короче ты каку то фигню спорол - чего тебе непонятно - напиши нормально, тем более, что я такое делал.
|
|
|
Записан
|
А птичку нашу прошу не обижать!!!
|
|
|
Гром
Птычк. Тьфу, птычник... Вот!
Готовлюсь к пенсии
Offline
Пол:
Бодрый птах
|
|
« Ответ #17 : 22-02-2006 14:34 » |
|
PooH, Мля - какой Зед ордер - млин - вы собвсем. как-то даже непрятно. Стиль отменяющий стоит - хоть читайте иногда - поставь в твоем таск менеджере отмену свойства "поверх всех окон" и все перекроешь.
|
|
|
Записан
|
А птичку нашу прошу не обижать!!!
|
|
|
Гром
Птычк. Тьфу, птычник... Вот!
Готовлюсь к пенсии
Offline
Пол:
Бодрый птах
|
|
« Ответ #18 : 22-02-2006 14:35 » |
|
Да - а потом качаем самопальную прогу, а она проц грузит на 100% - прорисовка окна по таймеру - с ума сойти, а поймать рефреш на свой собственный регион слабо?
|
|
|
Записан
|
А птичку нашу прошу не обижать!!!
|
|
|
Scorp__)
Молодой специалист
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
Глобальный модератор
Offline
Пол:
... и можно без хлеба!
|
|
« Ответ #20 : 23-02-2006 12:34 » |
|
PooH, Мля - какой Зед ордер - млин - вы собвсем. как-то даже непрятно. Стиль отменяющий стоит - хоть читайте иногда - поставь в твоем таск менеджере отмену свойства "поверх всех окон" и все перекроешь.
я упомянул Z-ордер только потому, что Finch сказал Это окно винда будет сама держать в самом верху z уровня. , а на самом деле это не совсем так. Ибо если окон "поверх всех" будет несколько они могут друг-друга перекрывать. А винда по умолчанию "список задач" выводит действительно поверх всех, даже поверх тех, кто "поверх всех"
|
|
|
Записан
|
Удачного всем кодинга! -=x[PooH]x=-
|
|
|
|