![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Не стираемое окно. [D6]
alpet © (2005-01-20 11:24:00)Надо организовать нестираемое окно, средствами GDI. Что бы оно всегда и везде было видно, и в полноэкранных приложениях вроде игр и видеопроигрываетелей.
Сейчас оно выводится, но не всегда сразу, и регулярно затирается, что вызывает мерцание.
alpet (2005-02-01 14:53:00) [1]Насколько я понял использовать перехват DX API. Не знаю справлюсь ли даже. Помоему для этой задачи есть и более простые решения.
Я заметил что при нажатии (без отпускания) ALT-TAB уверенно возникает окно с иконками других приложений. У меня тоже создаются окна, но в качестве элементов управления и дочерние по отношению к окну игры. Эти на этих окнах многие игры успешно рисуют, а на возникающем после нажатия ALT-TAB не могут, более того многие игры замирают. Как можно подобное окно создать?
Sapersky (2005-01-31 18:40:00) [2]Ну вот, вспомнил ссылку, могу носом ткнуть:
http://www.madshi.net
Да, относительно трудоёмко, да, нужно разбираться в 3D API. Но результат должен быть наилучшим из всех возможных - вместо отбивания ресурсов и прочего насилия мы аккуратно встраиваемся в процесс рендеринга, так что игра ничего и не заметит :)
alpet (2005-01-31 18:30:00) [3]Драйверы это будущее, когда дизассемблер заработает.
Мне сейчас бы больше подошел способ убеждения игры, в том что пользователь перешел к другой программе (собственно через ALT-TAB). Я пробывал посылать различные сообщения вроде WM_ACTIVATE, да все без толку.
Eraser (2005-01-31 14:44:00) [4]Без драйверов ядра тут никак не обойтись...
alpet (2005-01-31 11:20:00) [5]Однако лучше и не пытатся. Многие игры используют оверлей для вывода вводных мультиков, и после такого вмешательства могут упасть. Надо что-то другое. Плохо что рендеринг происходит на уровне ядра, и грузит проц, даже когда все потоки игры приостановлены. Как можно отбить ресурсы у Direct3D, помимо завышения приоритетов?
alpet (2005-01-28 14:30:00) [6]Я бы сказал что она только начата. Попробую воспользоваться оверлеями, вдруг поможет.
xShadow (2005-01-27 18:09:00) [7]
> alpet (27.01.05 17:07) [9]
Серьёзная работа проделана!
alpet (2005-01-27 17:07:00) [8]Мне бы сейчас хватило просто узнать заблокирована поверхность или нет. После разблокировки, я заморожу игру и нарисую окно.
Приложение кстати можно попробывать, его назначение как и у ArtMoney - взлом игр, только более изощеренный.
Доступно к скачиванию с сайтов:
www.alpet.hotmail.ru
www.idleman.narod.ru
Sapersky (2005-01-22 11:44:00) [9]А если приложение (игра) использует OpenGL? ;-)
Тогда перехват ф-ий OpenGL - это даже проще, т.к. это просто ф-ии, а не методы интерфейсов.
По теории перехвата ф-ий - см. книгу Рихтера (на сайте Подгорецкого есть).
Метод, действительно, не очень универсальный - нужно писать отдельно не только для OGL/DX, но и для каждой версии DX (для последних, по крайней мере).
Eraser (2005-01-21 23:33:00) [10]Sapersky
перехват DX-функций
А если приложение (игра) использует OpenGL? ;-)
Кроме "варарского" метода, других универсальных в виндовозе не сделаешь...
Sapersky (2005-01-21 23:10:00) [11]А если через оверлей замутить?
Вряд ли получится. Насколько я могу судить, в полноэкранном режиме допускается одновременная работа только одного DX-приложения, хотя бы потому, что оно захватывает всю видеопамять, в т.ч. выделенную ранее другими приложениями.
GDI рисует прямо на экран (первичную поверхность, которая общая для всех), поэтому и может "мерцать" одновременно с DX.
Но ИМХО "мерцание окном" - варварский метод :)
Более тонкий (но и более сложный) - перехват DX-функций (методов DX-интерфейсов). Пример есть в составе библиотеки madCollection (madCodeHook) - ссылку не помню, но найти, думаю, можно без проблем.
wal (2005-01-21 16:09:00) [12]А если через оверлей замутить?
Типа того http://www.delphimaster.ru/articles/directx/index.html
С уважением.
alpet (2005-01-21 11:47:00) [13]Проблема сейчас больше в другом: иногда просто не происходит рисование поверх изображения в игре, и приходится давать ей дополнительные кванты процессорного времени. Из-за чего это может быть, каким образом Direct3D может заблокировать вывод?
DVM (2005-01-20 12:06:00) [14]
> alpet (20.01.05 11:53) [2]
Такое возможно только в сотрудничестве с видеодрайвером. Но как конкретно это делается знают, пожалуй, только создатели драйверов для конкретных видеокарт. И не у всех драйверов такое есть. У NVidia лого так выводится.
alpet (2005-01-20 11:53:00) [15]В том то и проблема, что кода игра например работает, происходит запись в видеопамять, без отсечки области окон (DirectX). Я тут прикупил книгу "Программирование графики для Windows", и расматриваю различные методы отсечки. Когда окно работает в монопольном режиме (ввод) забираю все процессорные ресурсы, что бы не мерцало, но этот метод мне сильно не нравиться, как и приостановка потоков игры.
TUser (2005-01-20 11:41:00) [16]Я в таймере прописывал что-то типа Show или SetForegroundWindow - не помню точно. Это означает, что даже если твое Always on top - окошко перекроется какой-нибудь игрой или фильмом, - все равно через заданный интервал времени оно снова поЯВИтся. Вроде бы, FlashGet так же делает.