Member 13908153 Ответов: 1

Как захватить изображение рабочего стола в полноэкранном режиме qucikily?


Я хочу захватить изображение рабочего стола в win7 с помощью Getfrontbufferdata, интерфейсной функции в DirectX9Ex. Но я столкнулся с двумя следующими проблемами.

1. в оконном режиме я могу правильно захватить изображение рабочего стола. Затем я хочу захватить изображение в полноэкранном режиме. Поэтому я изменил оконное значение на FALSE,но потерпел неудачу в CreateDeviceEx.

...
 d3dppEx.Windowed = FALSE;//changed this
d3dppEx.Flags = D3DPRESENTFLAG_LOCKABLE_BACKBUFFER;
d3dppEx.BackBufferFormat = ddmEx.Format;
d3dppEx.BackBufferHeight = ddmEx.Height;
d3dppEx.BackBufferWidth = ddmEx.Width;
d3dppEx.MultiSampleType = D3DMULTISAMPLE_NONE;
d3dppEx.SwapEffect = D3DSWAPEFFECT_DISCARD;
//d3dpp.hDeviceWindow = hWnd;
d3dppEx.PresentationInterval = D3DPRESENT_INTERVAL_DEFAULT;
d3dppEx.FullScreen_RefreshRateInHz = D3DPRESENT_RATE_DEFAULT;

hr = g_pD3DEx-> CreateDeviceEx(D3DADAPTER_DEFAULT, D3DDEVTYPE_HAL, NULL,D3DCREATE_SOFTWARE_VERTEXPROCESSING,&d3dppEx, NULL, &g_pd3dDeviceEx);//failed and error code is 0x8876086c 

Как я могу решить эту проблему и получить изображение в полноэкранном режиме?

2. я обнаружил странное явление, когда тестировал свой код. Когда эффекты Areo win7 включены, скорость захвата просто составляет 10~20 Гц (MSDN сказал, что Getfrontbufferdata медленна по дизайну ). Но когда сменил тему на Windows classic, которая отключит Areo. Скорость захвата стала около 60 Гц. Затем я включаю Areo и восстанавливаю свою первоначальную тему. Скорость захвата все еще держится около 60 Гц,идеальная высокая частота!
Я Гус это связано с rdp, который windows uesd в удаленном рабочем столе. Но я не знаю, как это сделать в моем коде.

Что я уже пробовал:

1. Я изменил оконный значение в false, но не удалось создать устройство.

2. я попытался отключить Арео. Но потребовалось около 1 минуты, чтобы частота захвата была быстрой. Кроме того, я также хочу сохранить эффект Арео в своем проекте.
hr = DwmEnableComposition(DWM_EC_DISABLECOMPOSITION);

Затем я попытался включить сеанс rdp и добавил ниже код в свой проект, но ничего не изменилось.
HRESULT hr2 = S_OK;
hr2 = CoInitialize(NULL);
IRDPSRAPISharingSession* p_ShareSession;
IRDPSRAPIInvitationManager* p_InvitationManager;
IRDPSRAPIInvitation* p_Invitation;
hr2 = CoCreateInstance(__uuidof(RDPSession), NULL, CLSCTX_ALL, __uuidof(IRDPSRAPISharingSession), reinterpret_cast<void**>(&p_ShareSession));
IConnectionPointContainer* pConnectionPointContainer = NULL;
IConnectionPoint* pConnectionPoint = NULL;
unsigned long cid;
hr2 = p_ShareSession->QueryInterface(IID_IConnectionPointContainer, reinterpret_cast<void**>(&pConnectionPointContainer));
hr2 = p_ShareSession->Open();

1 Ответов

Рейтинг:
0

KarstenK

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