国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

DX后臺截圖C++實(shí)現(xiàn)代碼

這篇具有很好參考價(jià)值的文章主要介紹了DX后臺截圖C++實(shí)現(xiàn)代碼。希望對大家有所幫助。如果存在錯(cuò)誤或未考慮完全的地方,請大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問。

DX后臺截圖C++實(shí)現(xiàn)代碼

文章僅發(fā)布于https://www.cnblogs.com/Icys/p/DXGI.html和知乎上。

傳統(tǒng)的GDI API (BitBlt)雖然可以完美的完成后臺截圖的任務(wù),但是歸根結(jié)底效率還是太低。

直接使用DXGI方法截圖只能完成前臺窗口的截圖,而DX HOOK的截圖方法平添風(fēng)險(xiǎn),以及很多場景不現(xiàn)實(shí)。

本文講介紹使用 DwmGetDxSharedSurface 函數(shù),優(yōu)雅的完成后臺截圖的工作。

API介紹

函數(shù)定義
BOOL WINAPI DwmGetDxSharedSurface (
    HWND hwnd,
    HANDLE* phSurface,
    LUID* pAdapterLuid,
    ULONG* pFmtWindow,
    ULONG* pPresentFlags,
    ULONGLONG* pWin32kUpdateId
)

\(DwmGetDxSharedSurface\)來自于user32.dll(很離譜是吧,DwmApi不在DwmApi.dll里)。由于是ms沒有公開的API,需要使用動態(tài)方法加載。

調(diào)用函數(shù)方法
//動態(tài)載入該函數(shù)
typedef HRESULT(WINAPI* DwmGetDxSharedSurface_t)(HWND, HANDLE*, LUID*, ULONG*, ULONG*, ULONGLONG*);
DwmGetDxSharedSurface_t DwmGetDxSharedSurface = NULL;
//獲取地址
HMODULE hUser32 = LoadLibraryA("user32.dll");
if (hUser32 == NULL)
{
	std::cout << "LoadLibraryA failed" << std::endl;
	return 0;
}
DwmGetDxSharedSurface = (DwmGetDxSharedSurface_t)GetProcAddress(hUser32, "DwmGetDxSharedSurface");
//Dwm函數(shù) 在 user32.dll 中,真是離譜
if (DwmGetDxSharedSurface == NULL)
{
	std::cout << "GetProcAddress failed" << std::endl;
	return 0;
}
std::cout << DwmGetDxSharedSurface << std::endl;
參數(shù)含義
  • hwnd 被截圖窗口的句柄
  • phSurface 被截圖窗口的共享畫面的句柄(應(yīng)該是這么翻譯吧)
  • 其他,暫時(shí)還沒了解。

API調(diào)用

問題

顯然這個(gè)API不能一步到位獲得到BMP或者其他類型的圖像數(shù)據(jù)。和BitBlt一樣,這個(gè)API只是拿到了對應(yīng)畫面的副本(?,不清楚這樣描述是否準(zhǔn)確)。參照唯一有官方信息的API\(DwmDxGetWindowSharedSurface\),得到的是DX的一個(gè)對象,那就應(yīng)該從DX下手。

初始化DX

這里講個(gè)遇到的坑,DX設(shè)備的初始化不能在dllmain里進(jìn)行,否則會失敗。

HRESULT hr = S_OK;

hr = CreateDXGIFactory1(__uuidof(IDXGIFactory1), (void**)(&pFactory));
if (FAILED(hr))
{
	throw "CreateDXGIFactory1 failed";
	return 0;
}
pFactory->EnumAdapters(0, &pAdapter);

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
};

D3D11CreateDevice(pAdapter, D3D_DRIVER_TYPE_UNKNOWN, NULL, D3D11_CREATE_DEVICE_BGRA_SUPPORT, featureLevels, 6, D3D11_SDK_VERSION, &device, NULL, NULL);

if (device == NULL)
{
	throw "D3D11CreateDevice failed";
	return 0;
}
獲取phSurface
HANDLE phSurface = NULL;
// 使用DWM截取屏幕
DwmGetDxSharedSurface(hWnd, &phSurface, NULL, NULL, NULL, NULL);
if (phSurface == NULL)
{
	throw "Get Shared Surface Failded";
	return 0;
}
將數(shù)據(jù)載入
HRESULT hr = S_OK;

ID3D11Texture2D* sharedSurface = NULL;
hr = device->OpenSharedResource(phSurface, __uuidof(ID3D11Texture2D), (void**)&sharedSurface);//打開對應(yīng)資源
if (FAILED(hr))
{
	throw "OpenSharedResource failed";
	return 0;
}

D3D11_TEXTURE2D_DESC shared_desc;
sharedSurface->GetDesc(&shared_desc);

D3D11_TEXTURE2D_DESC description;

description.ArraySize = 1;
description.BindFlags = 0;
description.CPUAccessFlags = D3D11_CPU_ACCESS_READ;
description.Format = DXGI_FORMAT_B8G8R8A8_UNORM;
description.Height = shared_desc.Height;
description.MipLevels = 1;
description.SampleDesc = { 1, 0 };
description.Usage = D3D11_USAGE_STAGING;
description.Width = shared_desc.Width;
description.MiscFlags = 0;

hr = S_OK;

ID3D11Texture2D* texture = NULL;
hr = device->CreateTexture2D(&description, NULL, &texture);
if (FAILED(hr))
{
	sharedSurface->Release();
	throw "CreateTexture2D failed";
	return 0;
}
ID3D11DeviceContext* context = NULL;
device->GetImmediateContext(&context);
context->CopyResource(texture, sharedSurface);

D3D11_MAPPED_SUBRESOURCE mappedResource;
context->Map(texture, 0, D3D11_MAP_READ, 0, &mappedResource);

這里我們其實(shí)就已經(jīng)拿到了對應(yīng)的圖片資源

數(shù)據(jù)轉(zhuǎn)化

根據(jù)DX設(shè)備填入的D3D11_CREATE_DEVICE_BGRA_SUPPORT??梢灾?/p>

typedef struct D3D11_MAPPED_SUBRESOURCE {
  void *pData;
  UINT RowPitch;
  UINT DepthPitch;
} D3D11_MAPPED_SUBRESOURCE;

其中的pData應(yīng)該是一段對應(yīng)像素排列位BGRA的位圖。RowPitch是每行數(shù)據(jù)站的字長。為了方便我采用的是用OpenCV直接讀入這段數(shù)據(jù)

cv::Mat mat(shared_desc.Height, shared_desc.Width, CV_8UC4, mappedResource.pData, mappedResource.RowPitch);
cv::imshow("mat", mat);
cv::waitKey(0);
//轉(zhuǎn)BMP寫出
std::vector<uchar> buffer;
cv::imencode(".bmp", mat, buffer);

當(dāng)然也能用MFC

HBITMAP hbmp = CreateBitmap(shared desc.Width, shared desc.Height, 1 32, mappedResource.pData);
CImage img;
img.Attach(hbmp);
img.Save(L"233.bmp");
img.Detach();
DeleteObject(hbmp);

資源釋放

最后別忘記了

context->Release();
texture->Release();
sharedSurface->Release();

device->Release();
pAdapter->Release();
pFactory->Release();

FreeLibrary(hUser32);

采用CloseHandle沒法正常關(guān)掉phSurface,暫時(shí)不知道什么解決或方法,或是需不需要關(guān)掉

庫的鏈接

用到了DX方面的庫,當(dāng)然要把他們的lib給鏈接上,在cpp文件中添加以下代碼

#pragma comment(lib, "d3d11.lib")
#pragma comment(lib, "dxgi.lib")

問題

這個(gè)API截取不到標(biāo)題欄。另外也可能是本人對API和DX的理解水平還不到位D2D/D3D渲染的窗口截圖是全黑的。文章來源地址http://www.zghlxwxcb.cn/news/detail-746478.html

到了這里,關(guān)于DX后臺截圖C++實(shí)現(xiàn)代碼的文章就介紹完了。如果您還想了解更多內(nèi)容,請?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點(diǎn)僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實(shí)不符,請點(diǎn)擊違法舉報(bào)進(jìn)行投訴反饋,一經(jīng)查實(shí),立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費(fèi)用

相關(guān)文章

  • Vue3.2 + TypeScript + Pinia + Vite4 + Element-Plus + 微前端(qiankun) 后臺管理系統(tǒng)模板(已開源---顯示項(xiàng)目頁面截圖)

    Vue3.2 + TypeScript + Pinia + Vite4 + Element-Plus + 微前端(qiankun) 后臺管理系統(tǒng)模板(已開源---顯示項(xiàng)目頁面截圖)

    Wocwin-Admin,是基于 Vue3.2、TypeScript、Vite、Pinia、Element-Plus、Qiankun(微前端) 開源的一套后臺管理模板;同時(shí)集成了微前端 qiankun也可以當(dāng)做一個(gè)子應(yīng)用。項(xiàng)目中組件頁面使用了Element-plus 二次封裝 t-ui-plus 組件,目前已新增fastmock接口。 Link:https://wocwin.github.io/wocwin-admin/ 賬號:

    2024年02月08日
    瀏覽(40)
  • linux C++ 海康截圖Demo

    linux C++ ??到貓DDemo

    目錄 項(xiàng)目結(jié)構(gòu) ?編輯 CMakeLists.txt 代碼 camke ?編輯?make 運(yùn)行 測試 下載? cmake_minimum_required(VERSION 3.7) project(CapPictureTest) include_directories(include) link_directories(${CMAKE_SOURCE_DIR}/lib ${CMAKE_SOURCE_DIR}/lib/HCNetSDKCom)? add_executable(CapPictureTest ${CMAKE_SOURCE_DIR}/src/CapPictureTest.cpp) target_link_librarie

    2024年02月10日
    瀏覽(22)
  • 由于找不到d3dx9_42.dll,無法繼續(xù)執(zhí)行代碼怎么修復(fù),這三個(gè)修復(fù)方法可以解決

    由于找不到d3dx9_42.dll,無法繼續(xù)執(zhí)行代碼怎么修復(fù),這三個(gè)修復(fù)方法可以解決

    是不是遇到過在打開軟件或者游戲的時(shí)候,電腦提示“由于找不到d3dx9_42.dll,無法繼續(xù)執(zhí)行代碼”,無法正常啟動游戲程序,d3dx9_42.dll是一個(gè)DirectX相關(guān)的動態(tài)鏈接庫文件,它是DirectX 9中的一個(gè)組件。DirectX是微軟公司開發(fā)的一個(gè)多媒體圖形和游戲開發(fā)平臺,它極大地推動了計(jì)算

    2024年02月09日
    瀏覽(106)
  • AI從截圖直接生成代碼、前端程序員的福音

    AI從截圖直接生成代碼、前端程序員的福音

    簡介 項(xiàng)目可以將任何屏幕截圖或設(shè)計(jì)轉(zhuǎn)換為干凈的代碼(支持大多數(shù)框架)。來自領(lǐng)先公司的開發(fā)人員和設(shè)計(jì)師使用的排名第一的工具。完全開源,在 GitHub 上擁有超過 35,000 顆星。非常受歡迎。 各位小伙伴們感覺有幫助的,可以收藏一下,方便下次找到項(xiàng)目! 項(xiàng)目地址:

    2024年04月13日
    瀏覽(25)
  • 宜搭低代碼開發(fā)師(高級)創(chuàng)建待辦列表應(yīng)用 流程截圖及實(shí)例代碼(避坑專用)

    宜搭低代碼開發(fā)師(高級)創(chuàng)建待辦列表應(yīng)用 流程截圖及實(shí)例代碼(避坑專用)

    目錄 目標(biāo): 操作步驟: 一、主要涉及的接口 二、代碼及說明步驟 試題截圖及步驟代碼說明,很快完成考試。 這里基礎(chǔ)的兩個(gè)頁面創(chuàng)建很簡單,直接省略。 直接說自定義頁面——Todolist 接口文檔: 跨應(yīng)用數(shù)據(jù)源API | 釘釘宜搭·幫助中心 ①、獲取待辦 :/dingtalk/web/APP_XXXXXX

    2024年02月16日
    瀏覽(106)
  • C++調(diào)用opencv和windows api完成桌面窗口截圖——以夢幻西游為例

    C++調(diào)用opencv和windows api完成桌面窗口截圖——以夢幻西游為例

    項(xiàng)目編寫的C++程序,根據(jù)輸入的字符串,遍歷所有桌面窗口標(biāo)題,查找包含該標(biāo)題的窗口,對該桌面窗口進(jìn)行截圖,以夢幻西游為例 輸入:桌面窗口包含的字符串 比如輸入“夢幻”,程序就會截取桌面“夢幻西游”的窗口 輸出:該桌面窗口的截圖,數(shù)據(jù)類型為opencv的Mat矩陣

    2024年02月21日
    瀏覽(17)
  • 【IC設(shè)計(jì)】ZC706板卡點(diǎn)燈入門(含Verilog代碼,xdc約束,實(shí)驗(yàn)截圖)

    【IC設(shè)計(jì)】ZC706板卡點(diǎn)燈入門(含Verilog代碼,xdc約束,實(shí)驗(yàn)截圖)

    這篇博客將針對AMD Zynq 7000 SoC ZC706 Evaluation Kit板卡(對應(yīng)Vivado創(chuàng)建工程時(shí)FPGA型號:XC7Z045ffg900-2)實(shí)現(xiàn)基本的點(diǎn)燈程序。 本文對以下內(nèi)容不再介紹, 使用Vivado進(jìn)行綜合、實(shí)現(xiàn)、生成比特流并燒錄FPGA FPGA的概念、Verilog的基礎(chǔ)語法 板卡時(shí)鐘為200MHz,讓板子上的一個(gè)LED燈 保持 0.5秒亮

    2024年02月20日
    瀏覽(23)
  • 截圖轉(zhuǎn)HTML代碼,支持預(yù)覽,前端不用浪費(fèi)時(shí)間寫html和css了

    截圖轉(zhuǎn)HTML代碼,支持預(yù)覽,前端不用浪費(fèi)時(shí)間寫html和css了

    試用地址:https://picoapps.xyz/free-tools/screenshot-to-code 這個(gè)簡單的應(yīng)用可以將截圖轉(zhuǎn)換為HTML/Tailwind CSS代碼。它使用GPT-4 Vision來生成代碼,并使用DALL-E 3來生成類似的圖像。現(xiàn)在你也可以輸入一個(gè)URL來克隆一個(gè)現(xiàn)有的網(wǎng)站! NYTimes Original Replica Instagram頁面(沒有泰勒·斯威夫特的照

    2024年02月04日
    瀏覽(16)
  • 一張網(wǎng)頁截圖,AI幫你寫前端代碼,前端竊喜,終于不用干體力活了

    一張網(wǎng)頁截圖,AI幫你寫前端代碼,前端竊喜,終于不用干體力活了

    簡介 眾所周知,作為一個(gè)前端開發(fā)來說,尤其是比較偏營銷和頁面頻繁改版的項(xiàng)目,大部分的時(shí)間都在”套模板“,根本沒有精力學(xué)習(xí)前端技術(shù),那么這個(gè)項(xiàng)目可謂是讓前端的小伙伴們看到了一絲絲的 曙光 。 將屏幕截圖轉(zhuǎn)換為代碼(HTML/Tailwind CSS、React、Vue 或 Bootstrap)。它

    2024年04月29日
    瀏覽(24)
  • C++冒泡排序代碼實(shí)現(xiàn)

    C++冒泡排序代碼實(shí)現(xiàn)

    冒泡排序是一組數(shù)據(jù)元素中的相鄰元素兩兩比較,如果滿足前一個(gè)元素(i)比后一個(gè)元素(i+1)大則這兩個(gè)元素交換,否則向后比較元素(i+1)和元素(i+2),這只是一輪排序。有n個(gè)元素需要排n-1輪,每一輪的排序都不用比較之前已經(jīng)排好的數(shù)據(jù),所以第i輪的比較次數(shù)為(n-i-1)次。(個(gè)人

    2024年02月16日
    瀏覽(21)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包