DXGI Desktop Duplication에 대해 알고 싶습니다. 많이 읽었으며 Microsoft 웹 사이트의 DesktopDuplication 샘플 일부에서 복사 한 코드입니다. 내 계획은 다른 프로그램을 위해 새로운 텍스처를 만들고 싶기 때문에 DesktopImage에서 버퍼 또는 배열을 가져 오는 것입니다. 누군가가 내가 할 수있는 것을 설명 할 수 있기를 바랍니다. 내가 제대로 이해 해요 경우DXGI DirectX 11 Desktop Duplication에 대한 버퍼 또는 어레이 이해에 대한 이해
void DesktopDublication::GetFrame(_Out_ FRAME_DATA* Data, _Out_ bool* Timeout)
{
IDXGIResource* DesktopResource = nullptr;
DXGI_OUTDUPL_FRAME_INFO FrameInfo;
// Get new frame
HRESULT hr = m_DeskDupl->AcquireNextFrame(500, &FrameInfo, &DesktopResource);
if (hr == DXGI_ERROR_WAIT_TIMEOUT)
{
*Timeout = true;
}
*Timeout = false;
if (FAILED(hr))
{
}
// If still holding old frame, destroy it
if (m_AcquiredDesktopImage)
{
m_AcquiredDesktopImage->Release();
m_AcquiredDesktopImage = nullptr;
}
// QI for IDXGIResource
hr = DesktopResource->QueryInterface(__uuidof(ID3D11Texture2D), reinterpret_cast<void **>(&m_AcquiredDesktopImage));
DesktopResource->Release();
DesktopResource = nullptr;
if (FAILED(hr))
{
}
// Get metadata
if (FrameInfo.TotalMetadataBufferSize)
{
// Old buffer too small
if (FrameInfo.TotalMetadataBufferSize > m_MetaDataSize)
{
if (m_MetaDataBuffer)
{
delete[] m_MetaDataBuffer;
m_MetaDataBuffer = nullptr;
}
m_MetaDataBuffer = new (std::nothrow) BYTE[FrameInfo.TotalMetadataBufferSize];
if (!m_MetaDataBuffer)
{
m_MetaDataSize = 0;
Data->MoveCount = 0;
Data->DirtyCount = 0;
}
m_MetaDataSize = FrameInfo.TotalMetadataBufferSize;
}
UINT BufSize = FrameInfo.TotalMetadataBufferSize;
// Get move rectangles
hr = m_DeskDupl->GetFrameMoveRects(BufSize, reinterpret_cast<DXGI_OUTDUPL_MOVE_RECT*>(m_MetaDataBuffer), &BufSize);
if (FAILED(hr))
{
Data->MoveCount = 0;
Data->DirtyCount = 0;
}
Data->MoveCount = BufSize/sizeof(DXGI_OUTDUPL_MOVE_RECT);
BYTE* DirtyRects = m_MetaDataBuffer + BufSize;
BufSize = FrameInfo.TotalMetadataBufferSize - BufSize;
// Get dirty rectangles
hr = m_DeskDupl->GetFrameDirtyRects(BufSize, reinterpret_cast<RECT*>(DirtyRects), &BufSize);
if (FAILED(hr))
{
Data->MoveCount = 0;
Data->DirtyCount = 0;
}
Data->DirtyCount = BufSize/sizeof(RECT);
Data->MetaData = m_MetaDataBuffer;
}
Data->Frame = m_AcquiredDesktopImage;
Data->FrameInfo = FrameInfo;
}
안녕하세요. Alex, 고맙습니다. 하지만 바탕 화면 복제본을 창이나 장면으로 렌더링하고 싶지는 않습니다. 다른 응용 프로그램에서 텍스처가 필요합니다. 바이트 배열이나 버퍼에있는 데스크탑 이미지의 데이터 또는 모든 픽셀에 대해 빨간색 녹색 파란색과 알파 만 있으면됩니다. 어떤 사람이이 일이 어떻게 이루어지는 지 말해 줄 수 있습니까? – Boke
그래서 당신이 정말로 요구하는 것은 나중에 데이터를 검색 할 수 있도록 파일에 데이터를 저장하는 방법입니다. – Alex