|
|
|
因为需要知道当前系统的hdr开关状态,本想单独开发一个的,没想到 TrafficMonitor 支持自己开发插件,所以整了个插件。
hdr快捷切换开关是 win + alt + B
链接:https://pan.baidu.com/s/1N7K5ze98c_AR2SbOkeXILw
提取码:w1r5
代码就是用这个 TrafficMonitor 自带的插件demo代码改的。关键代码如下:- bool CheckDisplayHDRSupport(){ HRESULT hr; ComPtr<IDXGIFactory4> m_dxgiFactory; hr = CreateDXGIFactory2(0, IID_PPV_ARGS(&m_dxgiFactory)); if (FAILED(hr)) { return false; } // Retrieve the current default adapter. ComPtr<IDXGIAdapter1> dxgiAdapter; hr = m_dxgiFactory->EnumAdapters1(0, &dxgiAdapter); if (FAILED(hr)) { return false; } UINT i = 0; ComPtr<IDXGIOutput> currentOutput; ComPtr<IDXGIOutput> bestOutput; float bestIntersectArea = -1; bool bRet = false; while (dxgiAdapter->EnumOutputs(i, ¤tOutput) != DXGI_ERROR_NOT_FOUND) { bestOutput = currentOutput; ComPtr<IDXGIOutput6> output6; hr = bestOutput.As(&output6); if (FAILED(hr)) { continue; } DXGI_OUTPUT_DESC1 desc1; hr = output6->GetDesc1(&desc1); if (FAILED(hr)) { continue; } bRet = desc1.ColorSpace == DXGI_COLOR_SPACE_RGB_FULL_G2084_NONE_P2020; if (bRet) break; i++; } //m_dxgiFactory->Release(); return bRet;}void CCustomDrawItem::DrawItem(void* hDC, int x, int y, int w, int h, bool dark_mode){ //绘图句柄 CDC* pDC = CDC::FromHandle((HDC)hDC); //矩形区域 CRect rect(CPoint(x, y), CSize(w, h)); auto b = CheckDisplayHDRSupport(); LPCWSTR LL = b?L"hdr":L"nohdr"; //设置颜色 COLORREF color1{ dark_mode ? RGB(255, 143, 107) : RGB(227, 81, 16) }; COLORREF color2{ dark_mode ? RGB(183, 241, 96) : RGB(83, 131, 11) }; COLORREF color3{ dark_mode ? RGB(158, 218, 251) : RGB(6, 111, 168) }; CPen aPen, * pOldPen; aPen.CreatePen(PS_SOLID, 1, color1); pOldPen = pDC->SelectObject(&aPen); pDC->DrawText(LL, &rect, DT_LEFT); pDC->SelectObject(pOldPen);}
复制代码
链接器里,乱七八糟依赖项:- dxgi.libd3d12.libd3d11.libd2d1.libdwrite.libdxguid.lib
复制代码
延迟加载:
参考:- https://github.com/zhongyang219/TrafficMonitor/wiki/%E6%8F%92%E4%BB%B6%E5%BC%80%E5%8F%91%E6%8C%87%E5%8D%97https://github.com/zhongyang219/TrafficMonitorhttps://github.com/microsoft/DirectX-Graphics-Samples.git
复制代码 |
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有账号?立即注册
×
|