Модераторы: feodorv, GremlinProg, xvr, Fixin
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Полноэкранные графические прложения в Windows 7, DirectX & OpenGL, как сделать скриншот? 
:(
    Опции темы
xakdima
Дата 14.5.2010, 12:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 5
Регистрация: 24.2.2009

Репутация: 1
Всего: 1



Делаю прогу для снятия скриншотов, в ХР снимает отлично, а вот в Windows7 если игра запущена в полноэкранном режиме, то получаю либо снимок окна расположенного под окном игры, либо просто черный квадрат.


Хочу понять, как в Win7 теперь работают приложения в полноэкранном режиме.
PM MAIL   Вверх
BorisVorontsov
Дата 23.5.2010, 12:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Thinker
**


Профиль
Группа: Комодератор
Сообщений: 714
Регистрация: 3.11.2005
Где: Молдавия, г. Киши нёв

Репутация: 4
Всего: 10



Как решение "малой кровью", могу предложить временно отключать в Висте и Семерке Aero посредством DwmEnableComposition, делать скриншот и включать обратно
Если же делать правильно, то надо перехватывать создание устройства DirectX и сохранять BackBuffer средствами DirectX


--------------------
[code=cpp]
const char *out = "|*0>78-,+<|"; size_t cc = char_traits<char>::length(out);
for (size_t i=0;i<cc;i++){cout<<static_cast<char>((out[i]^89));}cout<<endl;
[/code]
PM MAIL ICQ GTalk   Вверх
Dem_max
Дата 24.5.2010, 04:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1780
Регистрация: 12.4.2007

Репутация: 16
Всего: 39



Лучше сразу смотреть в сторону DirectX


--------------------
Американские программисты долго не могли понять, почему русские при зависании Windоws всё время повторяют "Твой зайка написал" ("Yоur bunnу wrоte")
PM MAIL   Вверх
xakdima
Дата 24.5.2010, 21:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 5
Регистрация: 24.2.2009

Репутация: 1
Всего: 1



Про перехват я уже думал. Но наделся есть какой другой способ. Буду искать информацию как подменить метод в COM, для OpenGL уже все сделал =)
PM MAIL   Вверх
Sonic7272
Дата 12.9.2010, 01:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 42
Регистрация: 18.9.2009

Репутация: нет
Всего: 3



Может тему оживим?  Инфы в инете ну ооочень мало. Может кто то понял в чем фокус?
PM MAIL   Вверх
bigbuka
Дата 22.9.2010, 18:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 50
Регистрация: 1.10.2009

Репутация: нет
Всего: нет



c DwmEnableComposition(DWM_EC_DISABLECOMPOSITION);
вместо скрина просто черный экран 
причем если например во время скрина на рабочий стол накладывается что-то оверлейное то оно попадает в скрин
например таблички скайпа о появлении пользователя в сети
тему действительно надо оживить
вот нашел код по снятию скрина в DirectX приложении 
там необходимо  найти g_hWnd - окно directX приложения (ну это не сложно - FindWindow)
и найти g_pd3dDevice - сам незнаю что это ибо в dx приложениях не шарю...
может кто знает как получить этот g_pd3dDevice из чужого приложения??
Код

HRESULT blTakeScreenShot()
   {    
       HRESULT hr = S_OK;    
       LPDIRECT3DSURFACE9 frontbuf;    
       char filename[64];    
       FILE* f;    
       int x, y;    
       RECT rcWindow;     
       
       // look for the next free file    
       for(int i=0;i<999;i++)    
       {        
           // build the filename        
           sprintf(filename, "screen%.3d.bmp", i);        
           f = fopen(filename, "r");        
           if( f == NULL)            
               break;        
           else            
               fclose( f );    
       }     
       // get the screen resolution. If it's a windowed application get the whole    
       // screen size. If it's a fullscreen application you might have somewhere     
       // your defines as: #define SCREEN_WIDTH 800    
       if( !g_bWindowed )    
       {        
           x = SCREEN_WIDTH;        
           y = SCREEN_HEIGHT;    
       }    
       else    
       {        
           x = GetSystemMetrics( SM_CXSCREEN );        
           y = GetSystemMetrics( SM_CYSCREEN );                
           // to get the window sizes        
           GetWindowRect( g_hWnd, &rcWindow );    
       }     
       // here we create an empty Surface. The parameter D3DFMT_A8R8G8B8 creates an 32 bit image with    
       // an alpha channel and 8 bits per channel.    
       if( FAILED( hr = g_pd3dDevice->CreateOffscreenPlainSurface(x, y, D3DFMT_A8R8G8B8, D3DPOOL_SCRATCH, &frontbuf, NULL)))        
           return hr;     
       // now we copy the entire frontbuffer into our new surface. The first parameter is NULL since    
       // we assume we have only one swap chain    
       if( FAILED( hr = g_pd3dDevice->GetFrontBufferData(NULL, frontbuf)))    
       {        
           // if this fails release our surface so we have no memory leak        
           frontbuf->Release();        
           return hr;    
       }     
       // This is the most important functions. The DirectX-SDK provides this handy little function to    
       // save our surface to a file. The first parameter is our specified filename, the second parameter    
       // tells DirectX what kind of file we want to save (in this example we decide to save to BMP)    
       // Note the difference between a fullscreen screenshot and a windowed one. If we have a windowed application    
       // we only want the specified RECT saved from our screen capture    
       if( !g_bWindowed )        
           D3DXSaveSurfaceToFile(filename, D3DXIFF_BMP, frontbuf, NULL, NULL);    
       else        
           D3DXSaveSurfaceToFile(filename, D3DXIFF_BMP, frontbuf, NULL, &rcWindow);     
       
       frontbuf->Release();     
       return hr;
   }

PM MAIL   Вверх
xvr
Дата 23.9.2010, 09:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 7046
Регистрация: 28.8.2007
Где: Дублин, Ирландия

Репутация: 40
Всего: 223



Цитата(bigbuka @  22.9.2010,  18:16 Найти цитируемый пост)
вот нашел код по снятию скрина в DirectX приложении
Это способ для САМОГО d3d приложения сохранить кадр в файла. Снаружи этот фокус не пройдет

Цитата(bigbuka @  22.9.2010,  18:16 Найти цитируемый пост)
может кто знает как получить этот g_pd3dDevice из чужого приложения??
Никак. Это COM объект, чем поможет указатель на объект в чужом приложении?


PM MAIL   Вверх
xakdima
Дата 23.9.2010, 17:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 5
Регистрация: 24.2.2009

Репутация: 1
Всего: 1



Цитата(xvr @  23.9.2010,  09:23 Найти цитируемый пост)
Цитата(bigbuka @  22.9.2010,  18:16 Найти цитируемый пост)
может кто знает как получить этот g_pd3dDevice из чужого приложения??
Никак. Это COM объект, чем поможет указатель на объект в чужом приложении?


Введение в COM
Перехват методов COM интерфейсов
PM MAIL   Вверх
xvr
Дата 23.9.2010, 19:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 7046
Регистрация: 28.8.2007
Где: Дублин, Ирландия

Репутация: 40
Всего: 223



Цитата(xakdima @ 23.9.2010,  17:43)
Цитата(xvr @  23.9.2010,  09:23 Найти цитируемый пост)

Это COM объект, чем поможет указатель на объект в чужом приложении?


Введение в COM
Перехват методов COM интерфейсов

Статья очень интересная, но увы она не поможет bigbuka перехватить COM интерфейс в чужом приложении


PM MAIL   Вверх
ASMatic
Дата 27.9.2010, 08:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 254
Регистрация: 14.3.2009

Репутация: 1
Всего: 1



Цитата(xvr @  23.9.2010,  17:43 Найти цитируемый пост)
перехватить COM интерфейс в чужом приложении

инжект длл поможет.)
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Системное программирование и WinAPI"
Fixin
GremlinProg
xvr
feodorv
  • Большое количество информации и примеров с использованием функций WinAPI можно найти в MSDN
  • Описание сообщений, уведомлений и примеров с использованием компонент WinAPI (BUTTON, EDIT, STATIC, и т.п.), можно найти в MSDN Control Library
  • Непосредственно, перед созданием новой темы, проверьте заголовок и удостоверьтесь, что он отражает суть обсуждения.
  • После заполнения поля "Название темы", обратите внимание на наличие и содержание панели "А здесь смотрели?", возможно Ваш вопрос уже был решен.
  • Приводите часть кода, в которой предположительно находится проблема или ошибка.
  • Если указываете код, пользуйтесь тегами [code][/code], или их кнопочными аналогами.
  • Если вопрос решен, воспользуйтесь соответствующей ссылкой, расположенной напротив названия темы.
  • Один топик - один вопрос!
  • Перед тем как создать тему - прочтите это .

На данный раздел распространяются Правила форума и Правила раздела С++:Общие вопросы .


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Chipset, Step, Fixin, GremlinProg, xvr. feodorv.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Системное программирование и WinAPI | Следующая тема »


 




[ Время генерации скрипта: 0.1277 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.