Ich versuche, einen einfachen Code in C++ zu machen, um einen Screenshot zu machen und den Puffer von Pixeln (RGB) zu bekommen. Ich verwende DirectX, aber ich habe einen Segmentierungsfehler. Ich folgte einem Code, den ich fand, aber nichts.Screenshot Desktop DirectX C++/QT
hier ist mein Code:
static void* pBits;
static IDirect3DDevice9* g_pd3dDevice;
void Screenshot::dxCaptureScreen() {
IDirect3DSurface9* pSurface;
g_pd3dDevice->CreateOffscreenPlainSurface(_screenWidth, _screenHeight, D3DFMT_A8R8G8B8, D3DPOOL_SCRATCH, &pSurface, NULL); //Segfault here.
g_pd3dDevice->GetFrontBufferData(0, pSurface);
D3DLOCKED_RECT lockedRect;
pSurface->LockRect(&lockedRect, NULL, D3DLOCK_NO_DIRTY_UPDATE | D3DLOCK_NOSYSLOCK | D3DLOCK_READONLY);
for (int i = 0; i < _screenHeight; i++) {
memcpy((BYTE*)pBits + i * _screenWidth * 32/8, (BYTE*) lockedRect.pBits + i * lockedRect.Pitch, _screenWidth * 32/8);
}
pSurface->UnlockRect();
pSurface->Release();
}
Kann mir jemand helfen bitte?
Vielen Dank für Ihre Antwort. Ich kenne diesen Weg in QT, Problem ist, dass ich diese Funktion viel aufrufen und Bilder über Sockets senden möchte, um eine Spiegelung in einem anderen Gerät zu simulieren. Also ich bin auf der Suche nach Effizienz ... Ich wollte DirectX – DevAndroid
@DevAndroid verwenden, Sie werden wahrscheinlich feststellen, dass das Senden und Komprimieren der Bilder viel länger dauert als der Screenshot und die Optimierung nach der Entwicklung Ihrer Lösung besser aussehen würde mit Qt-Handling, um den Bildschirm zu erfassen. – TheDarkKnight
Das stimmt, ich werde etwas völlig anderes benutzen. Ich werde nur senden, wenn es eine Bewegung gibt und Pixel auf dem Bildschirm ändern ... Es wäre besser und effizienter. – DevAndroid