Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2005.03.13;
Скачать: CL | DM;

Вниз

Не стираемое окно.   Найти похожие ветки 

 
alpet   (2005-01-20 11:24) [0]

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


 
TUser ©   (2005-01-20 11:41) [1]

Я в таймере прописывал что-то типа Show или SetForegroundWindow - не помню точно. Это означает, что даже если твое Always on top - окошко перекроется какой-нибудь игрой или фильмом, - все равно через заданный интервал времени оно снова поЯВИтся. Вроде бы, FlashGet так же делает.


 
alpet   (2005-01-20 11:53) [2]

В том то и проблема, что кода игра например работает, происходит запись в видеопамять, без отсечки области окон (DirectX). Я тут прикупил книгу "Программирование графики для Windows", и расматриваю различные методы отсечки. Когда окно работает в монопольном режиме (ввод) забираю все процессорные ресурсы, что бы не мерцало, но этот метод мне сильно не нравиться, как и приостановка потоков игры.


 
DVM ©   (2005-01-20 12:06) [3]


> alpet   (20.01.05 11:53) [2]

Такое возможно только в сотрудничестве с видеодрайвером. Но как конкретно это делается знают, пожалуй, только создатели драйверов для конкретных видеокарт. И не у всех драйверов такое есть. У NVidia лого так выводится.


 
alpet   (2005-01-21 11:47) [4]

Проблема сейчас больше в другом: иногда просто не происходит рисование поверх изображения в игре, и приходится давать ей дополнительные кванты процессорного времени. Из-за чего это может быть, каким образом Direct3D может заблокировать вывод?


 
wal ©   (2005-01-21 16:09) [5]

А если через оверлей замутить?
Типа того http://www.delphimaster.ru/articles/directx/index.html

С уважением.


 
Sapersky   (2005-01-21 23:10) [6]

А если через оверлей замутить?

Вряд ли получится. Насколько я могу судить, в полноэкранном режиме допускается одновременная работа только одного DX-приложения, хотя бы потому, что оно захватывает всю видеопамять, в т.ч. выделенную ранее другими приложениями.
GDI рисует прямо на экран (первичную поверхность, которая общая для всех), поэтому и может "мерцать" одновременно с DX.

Но ИМХО "мерцание окном" - варварский метод :)
Более тонкий (но и более сложный) - перехват DX-функций (методов DX-интерфейсов). Пример есть в составе библиотеки madCollection (madCodeHook) - ссылку не помню, но найти, думаю, можно без проблем.


 
Eraser ©   (2005-01-21 23:33) [7]

Sapersky
перехват DX-функций

А если приложение (игра) использует OpenGL? ;-)
Кроме "варарского" метода, других универсальных в виндовозе не сделаешь...


 
Sapersky   (2005-01-22 11:44) [8]

А если приложение (игра) использует OpenGL? ;-)

Тогда перехват ф-ий OpenGL - это даже проще, т.к. это просто ф-ии, а не методы интерфейсов.
По теории перехвата ф-ий - см. книгу Рихтера (на сайте Подгорецкого есть).
Метод, действительно, не очень универсальный - нужно писать отдельно не только для OGL/DX, но и для каждой версии DX (для последних, по крайней мере).


 
alpet   (2005-01-27 17:07) [9]

Мне бы сейчас хватило просто узнать заблокирована поверхность или нет. После разблокировки, я заморожу игру и нарисую окно.

Приложение кстати можно попробывать, его назначение как и у ArtMoney - взлом игр, только более изощеренный.
Доступно к скачиванию с сайтов:
www.alpet.hotmail.ru
www.idleman.narod.ru


 
xShadow ©   (2005-01-27 18:09) [10]


> alpet   (27.01.05 17:07) [9]

Серьёзная работа проделана!


 
alpet   (2005-01-28 14:30) [11]

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


 
alpet   (2005-01-31 11:20) [12]

Однако лучше и не пытатся. Многие игры используют оверлей для вывода вводных мультиков, и после такого вмешательства могут упасть. Надо что-то другое. Плохо что рендеринг происходит на уровне ядра, и грузит проц, даже когда все потоки игры приостановлены. Как можно отбить ресурсы у Direct3D, помимо завышения приоритетов?


 
Eraser ©   (2005-01-31 14:44) [13]

Без драйверов ядра тут никак не обойтись...


 
alpet   (2005-01-31 18:30) [14]

Драйверы это будущее, когда дизассемблер заработает.
Мне сейчас бы больше подошел способ убеждения игры, в том что пользователь перешел к другой программе (собственно через ALT-TAB).  Я пробывал посылать различные сообщения вроде WM_ACTIVATE, да все без толку.


 
Sapersky   (2005-01-31 18:40) [15]

Ну вот, вспомнил ссылку, могу носом ткнуть:
http://www.madshi.net
Да, относительно трудоёмко, да, нужно разбираться в 3D API. Но результат должен быть наилучшим из всех возможных - вместо отбивания ресурсов и прочего насилия мы аккуратно встраиваемся в процесс рендеринга, так что игра ничего и не заметит :)


 
alpet   (2005-02-01 14:53) [16]

Насколько я понял использовать перехват DX API. Не знаю справлюсь ли даже. Помоему для этой задачи есть и более простые решения.
Я заметил что при нажатии (без отпускания) ALT-TAB уверенно возникает окно с иконками других приложений. У меня тоже создаются окна, но в качестве элементов управления и дочерние по отношению к окну игры. Эти на этих окнах многие игры успешно рисуют, а на возникающем после нажатия ALT-TAB не могут, более того многие игры замирают. Как можно подобное окно создать?



Страницы: 1 вся ветка

Текущий архив: 2005.03.13;
Скачать: CL | DM;

Наверх




Память: 0.51 MB
Время: 0.042 c
4-1107016168
read_me
2005-01-29 19:29
2005.03.13
надо узнать координаты окна


3-1108327778
Коля
2005-02-13 23:49
2005.03.13
Как узнать индекс поля где находится указатель в Query?


9-1102772405
malij
2004-12-11 16:40
2005.03.13
GlScene


1-1109267295
Fenik
2005-02-24 20:48
2005.03.13
Память, занимаемая массивом, содержащим дин. массивы.


3-1108239885
kblc
2005-02-12 23:24
2005.03.13
Файлы в Access