![]() |
本帖最后由 wlp 于 2025-1-1 12:45 编辑 放一份C++ DXGI截图代码,利用上面的com方法,易语言也能搞dx截图,等有空再实现.. [C++] 纯文本查看 复制代码 #include <windows.h> #include <dxgi1_2.h> #include <d3d11.h> #include <iostream> #include <vector> #pragma comment(lib, "dxgi.lib") #pragma comment(lib, "d3d11.lib") void SaveScreenPixelsToMemory() { // 初始化 D3D11 和 DXGI 设备 IDXGIFactory1* factory = nullptr; HRESULT hr = CreateDXGIFactory1(__uuidof(IDXGIFactory1), (void**)&factory); if (FAILED(hr)) { std::cerr << "Failed to create DXGIFactory." << std::endl; return; } IDXGIAdapter1* adapter = nullptr; hr = factory->EnumAdapters1(0, &adapter); if (FAILED(hr)) { std::cerr << "Failed to enumerate adapters." << std::endl; return; } ID3D11Device* device = nullptr; ID3D11DeviceContext* context = nullptr; D3D_FEATURE_LEVEL featureLevel; /* hr = D3D11CreateDevice(adapter, D3D_DRIVER_TYPE_HARDWARE, nullptr, D3D11_CREATE_DEVICE_BGRA_SUPPORT, nullptr, 0, D3D11_SDK_VERSION, &device, &featureLevel, &context); if (FA */ const D3D_FEATURE_LEVEL featureLevels[] = { D3D_FEATURE_LEVEL_11_0, D3D_FEATURE_LEVEL_10_1, D3D_FEATURE_LEVEL_10_0, D3D_FEATURE_LEVEL_9_3, D3D_FEATURE_LEVEL_9_2, D3D_FEATURE_LEVEL_9_1 }; hr = D3D11CreateDevice(adapter, D3D_DRIVER_TYPE_UNKNOWN, nullptr, D3D11_CREATE_DEVICE_BGRA_SUPPORT, featureLevels, 6, D3D11_SDK_VERSION, &device, &featureLevel, &context); /* hr = D3D11CreateDevice(adapter, D3D_DRIVER_TYPE_UNKNOWN, nullptr, 0, nullptr, 0, D3D11_SDK_VERSION, &device, &featureLevel, &context); */ if (FAILED(hr)) { std::cerr << "Failed to create D3D11 device." << std::endl; return; } IDXGIOutput* output = nullptr; hr = adapter->EnumOutputs(0, &output); if (FAILED(hr)) { std::cerr << "Failed to enumerate outputs." << std::endl; return; } IDXGIOutput1* output1 = nullptr; hr = output->QueryInterface(__uuidof(IDXGIOutput1), (void**)&output1); if (FAILED(hr)) { std::cerr << "Failed to get IDXGIOutput1." << std::endl; return; } IDXGIOutputDuplication* duplication = nullptr; hr = output1->DuplicateOutput(device, &duplication); if (FAILED(hr)) { std::cerr << "Failed to create output duplication." << std::endl; return; } DXGI_OUTDUPL_DESC duplDesc; duplication->GetDesc(&duplDesc); int width = duplDesc.ModeDesc.Width; int height = duplDesc.ModeDesc.Height; // 开始捕获屏幕 DXGI_OUTDUPL_FRAME_INFO frameInfo = {0}; IDXGIResource* desktopResource = nullptr; while(1) { hr = duplication->AcquireNextFrame(500, &frameInfo, &desktopResource); if (FAILED(hr)) { std::cerr << "Failed to acquire next frame." << std::endl; return; } if (frameInfo.LastPresentTime.QuadPart == 0) { duplication->ReleaseFrame(); Sleep(1); continue; } break; } ID3D11Texture2D* desktopImage = nullptr; hr = desktopResource->QueryInterface(__uuidof(ID3D11Texture2D), (void**)&desktopImage); if (FAILED(hr)) { std::cerr << "Failed to get ID3D11Texture2D from IDXGIResource." << std::endl; return; } // 创建 staging texture 用于 CPU 访问 D3D11_TEXTURE2D_DESC desc; desktopImage->GetDesc(&desc); desc.Usage = D3D11_USAGE_STAGING; desc.BindFlags = 0; desc.CPUAccessFlags = D3D11_CPU_ACCESS_READ; desc.MiscFlags = 0; ID3D11Texture2D* stagingTexture = nullptr; hr = device->CreateTexture2D(&desc, nullptr, &stagingTexture); if (FAILED(hr)) { std::cerr << "Failed to create staging texture." << std::endl; return; } context->CopyResource(stagingTexture, desktopImage); // 映射纹理到 CPU D3D11_MAPPED_SUBRESOURCE mappedResource; hr = context->Map(stagingTexture, 0, D3D11_MAP_READ, 0, &mappedResource); if (FAILED(hr)) { std::cerr << "Failed to map staging texture." << std::endl; return; } // 处理像素数据 std::vector<unsigned char> pixels; pixels.resize(width * height * 4); unsigned char* src = (unsigned char*)mappedResource.pData; int rowPitch = mappedResource.RowPitch; for (int y = 0; y < height; ++y) { memcpy(&pixels[y * width * 4], &src[y * rowPitch], width * 4); } context->Unmap(stagingTexture, 0); // 打印一些像素数据 for (int i = 0; i < 100; ++i) { int pixelIndex = i * 4; unsigned char b = pixels[pixelIndex + 0]; unsigned char g = pixels[pixelIndex + 1]; unsigned char r = pixels[pixelIndex + 2]; std::cout << "Pixel " << i << ": R=" << (int)r << " G=" << (int)g << " B=" << (int)b << std::endl; } // 清理资源 duplication->ReleaseFrame(); desktopResource->Release(); stagingTexture->Release(); desktopImage->Release(); duplication->Release(); output1->Release(); output->Release(); context->Release(); device->Release(); adapter->Release(); factory->Release(); } int main() { SaveScreenPixelsToMemory(); return 0; } |
uyhj 发表于 2025-1-3 11:47 HEX解码,就是HEX到字节集 |
![]() 不知道少了哪,这里不显示了 |
全都是大佬~ |
感谢发布原创作品,精易因你更精彩!6666666666666 |
#在这里快速回复#cha询到所有方法 |
6666666666666666666666666666 |
感谢分享 |
美夜赤月 发表于 2025-1-2 00:28 这个还好,有函数信息,不像WIC,只有C的抽象接口 |
感谢发布原创作品,精易因你更精彩!6666666666666 |
sitemap|
易语言源码|
易语言教程|
易语言论坛|
易语言模块|
手机版|
广告投放|
精易论坛
拒绝任何人以任何形式在本论坛发表与中华人民共和国法律相抵触的言论,本站内容均为会员发表,并不代表精易立场!
论坛帖子内容仅用于技术交流学习和研究的目的,严禁用于非法目的,否则造成一切后果自负!如帖子内容侵害到你的权益,请联系我们!
防范网络诈骗,远离网络犯罪 违法和不良信息举报QQ: 793400750,邮箱:[email protected]
网站简介:精易论坛成立于2009年,是一个程序设计学习交流技术论坛,隶属于揭阳市揭东区精易科技有限公司所有。
Powered by Discuz! X3.4 揭阳市揭东区精易科技有限公司
( 粤ICP备12094385号-1) 粤公网安备 44522102000125 增值电信业务经营许可证 粤B2-20192173