屏幕截图桌面DirectX C /QT
Screenshot Desktop DirectX C++/QT
我正在尝试在C 中制作一个简单的代码以制作屏幕截图并获取像素的缓冲区(RGB(。我正在使用DirectX,但我有一个细分错误。我遵循了一些我发现的代码,但什么也没有。
这是我的代码:
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();
}
有人可以帮我吗?
我解决了有关如何使用DirectX进行屏幕截图的问题,这是我的代码:
int Screenshot::dxCaptureScreen() {
int ret = 0;
IDirect3DDevice9 *g_pd3dDevice;
D3DPRESENT_PARAMETERS d3dpp;
IDirect3D9 *g_pD3D = NULL;
IDirect3DSurface9 *pSurface;
D3DLOCKED_RECT lockedRect;
g_pD3D = Direct3DCreate9(D3D_SDK_VERSION);
if (g_pD3D == NULL)
return 0;
ZeroMemory(&d3dpp, sizeof(d3dpp));
d3dpp.Windowed = TRUE;
d3dpp.SwapEffect = D3DSWAPEFFECT_COPY;
d3dpp.BackBufferFormat = D3DFMT_UNKNOWN;
d3dpp.BackBufferCount = 1;
d3dpp.MultiSampleType = D3DMULTISAMPLE_NONE;
d3dpp.MultiSampleQuality = 0;
d3dpp.EnableAutoDepthStencil = TRUE;
d3dpp.AutoDepthStencilFormat = D3DFMT_D16;
d3dpp.hDeviceWindow = hDesktopWnd;
d3dpp.Flags = D3DPRESENTFLAG_LOCKABLE_BACKBUFFER;
d3dpp.FullScreen_RefreshRateInHz = D3DPRESENT_RATE_DEFAULT;
d3dpp.PresentationInterval = D3DPRESENT_INTERVAL_DEFAULT;
if ((ret = g_pD3D->CreateDevice(D3DADAPTER_DEFAULT, D3DDEVTYPE_HAL, hDesktopWnd, D3DCREATE_SOFTWARE_VERTEXPROCESSING, &d3dpp, &g_pd3dDevice)) != D3D_OK)
return ret;
if ((ret = g_pd3dDevice->CreateOffscreenPlainSurface(_screenWidth, _screenHeight, D3DFMT_A8R8G8B8, D3DPOOL_SCRATCH, &pSurface, NULL)) != D3D_OK)
return ret;
if ((ret = g_pd3dDevice->GetFrontBufferData(0, pSurface)) != D3D_OK)
return ret;
pSurface->LockRect(&lockedRect, NULL, D3DLOCK_NO_DIRTY_UPDATE | D3DLOCK_NOSYSLOCK | D3DLOCK_READONLY);
for (int i = 0; i < _screenHeight; i++) {
memcpy(pPixels + i * _screenWidth * 32 / 8, (BYTE*) lockedRect.pBits + i * lockedRect.Pitch, _screenWidth * 32 / 8);
}
我注意到它不是很快...使用GDI窗口,花费的时间更少。
如果您有一个qquickwindow和一个手柄,并且想捕获该窗口中可见的内容,则可以简单地执行此操作:
QQuickWindow* window = qobject_cast<QQuickWindow*>(mYourWindowHandle);
QPixmap screenshot = window->grabWindow();
相关文章:
- Qt VTK交互风格的信号到小部件
- QT在错误的班级中寻找空位
- 如何在选项卡视图Qt中设置一个新项目,并保存以前的项目
- 如何在Qt窗口小部件中使用QStringView(或QStringRef)
- 如何在Qt C++中更改光标
- 如何在MS Visual Studio 2019中运行QT UI
- QT通过C++添加映射QML项目
- libssh 的函数在构建 libssh 时无法在 Qt 和 cmake 错误中找到
- 如何将点击的信号和插槽添加到qt中的自定义按钮中
- Qt C++静态thread_local QNetworkAccessManager是线程应用程序的好选择吗
- 使用Qt C++计算类似Git的SHA1哈希
- Qt focusObjectChanged example?
- 如何在cpp文件之间切换窗口?在Qt中
- Qt和C++:将QLineEdit添加到QTabWidget中
- 从数据库实时显示QT c++中的数据
- Qt Quick-如何仅从c++代码与qml属性交互
- 无法使用Qt Creator在Windows中构建yaml-cpp
- 如何在directx/c++中进行平移/缩放操作
- 如何在Qt中取消捕获字符串
- 屏幕截图桌面DirectX C /QT