Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "WinAPI";
Текущий архив: 2005.03.13;
Скачать: [xml.tar.bz2];

Вниз

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

 
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 вся ветка

Форум: "WinAPI";
Текущий архив: 2005.03.13;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.48 MB
Время: 0.039 c
11-1092842072
nOvell
2004-08-18 19:14
2005.03.13
Bitmap в MainMenu


1-1109669096
XP
2005-03-01 12:24
2005.03.13
Operator not applicable to this operand type


3-1108428160
Витёк
2005-02-15 03:42
2005.03.13
Добавить поле в DBF, используя ADO


1-1109254455
Sen====
2005-02-24 17:14
2005.03.13
Stream read error


8-1101295022
Novichok
2004-11-24 14:17
2005.03.13
как с помощью DelphiX сделать screenshot





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский