Как захватить изображение рабочего стола в полноэкранном режиме 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();