Может ли внешняя программа вставить/разместить своё окно поверх окна в DX с параметрами эксклюзив и фулскрин? Например, проверять у какой-либо проги скорость кадров и выводить это юзеру. Точнее можно ли сделать окно, которое будет висеть поверх окна современной DX-ной игрухи?
Эксклюзив потому так и назван, что только _одно_ окно может иметь такой статус. Когда прога делает SetCooperativeLevel с DDSCL_EXCLUSIVE|DDSCL_FULLSCREEN, то если до этого какая-то другая была в таком режиме, у неё отбирается доступ к полному экрану - все методы начнут возвращать ошибки и TestCooperativeLevel вернёт DDERR_WRONGMODE. Всё это как раз и сделано, чтобы никто никаких окон поверх не показывал Рисовать поверх чужой FULLSCREEN картинки можно с применение хирургических методов - хуки, дополнительные dll и т.п. Общего решения возможно и нет.
А как мой firewall открывает диалог, когда некоторой FPS выходит в сеть на мултиплеер впервые? И еще, если у меня есть дополнительной тулбар на десктопе и у него "Auto HIde" и "Always on top", то он тоже стоит поверх полноекранные стрелялки. (Правда, они возможно и OpenGL - я не специалист)
Ну можно ещё и Ctrl+Alt+Del нажать - окно Task Manager появится. Но многое зависит от того, как именно посторено DX приложение, как оно обрабатывает потерю фокуса и т.п. Можно сделать так, что его окно в этом случае будет просто сворачивается. Тулбары и другие подобные окна - это известная проблема для DX приложений, их специально пытаются обойти - часто можно заметить, что такое окно мелькает, но тут же сверху игрушка рисует свою картинку. А firewall - это отдельная история, он же замораживает приложение, пока на его вопрос не ответишь.
А как можно получить указатель на видеопамять процесса или окна/DX поверхности в эксклюзивном режиме? Ведь так можно рисовать в его видео памяти? Например, отслеживать бряком доступ к нужному региону и самому писать туда. И совсем ламерский вопрос. Как узнать размер картинки/окна в видеопамяти и глубину цвета, чтобы писать правильно?
Если есть адрес объекта этой поверхности, то можно вызвать метод Lock - в структуре DDSURFACEDESC получишь адрес и остальные характеристики поверхности. Если объекта нет, то перехватывать этот метод в ddraw.dll. Но рисовать имеет смысл только дождавшись, когда прога вызовет Unlock. Теоретически, это должно работать и для OGL, поскольку тот работает через поверхности DD. С новыми интерфейсами DXGraphics не знаю как это будет работать - попробуй в САйсе поставить бряки на ddraw!DD_Surface_Lock и посмотри.