很久以前使用过directdraw,前段时间看到了一个有趣的使用overlay的程序,执行了一下竟然不可用。
于是我做了如下的测试:
有两台电脑,执行一个叫OverlayDrawTest的例子程序。
win11检测到没有overlay能力
win10检测到有overlay能力
提示:DXERROR(0x88760104, "DDERR_NOOVERLAYHW", "Operation could not be carried out because there is no overlay hardware present or available.")
即便是win10上,使用相同代码
一个是旧项目做减法获得的console项目OverlayDraw,可以使用overlayer
一个是重新创建的console项目Direct12XApiTest,不可用overlayer
能做的配置全部检查了,包括:
检查显卡型号,重新安装显卡驱动。
使用dxdiag检查directx能力
打开NVIDIA 控制面板,开启三重缓冲
按快捷键Alt + Z的键,打开覆盖层
打开服务管理,开启NVIDIA Geforce Overlay程序服务
更换window sdk版本
添加::CoInitialize(NULL);
把DirectDraw7接口换成DirectDraw2接口,GetCaps依然没有overlay标记。
所有这些努力,都无法改变结果。
代码如下:
#include <windows.h> #include <atlbase.h> // ATL CComPtr #include <ddraw.h> #include <uuids.h> #pragma comment (lib, "dxguid") #pragma comment (lib, "DDraw.lib") #include <memory> #include <iostream> int main() { ::CoInitialize(NULL); CComPtr<IDirectDraw7> directDraw_; HRESULT ddrval = DirectDrawCreateEx(0, (void**)&directDraw_, IID_IDirectDraw7, 0); //创建DirectCraw对象 if (ddrval != DD_OK){ MessageBox(NULL, L"Failure Creating DirectDraw Object",L"", MB_OK); return 0; } DDCAPS helcaps; ZeroMemory(&helcaps, sizeof(helcaps)); helcaps.dwSize = sizeof(helcaps); DDCAPS ddcaps; ZeroMemory(&ddcaps, sizeof(ddcaps)); ddcaps.dwSize = sizeof(ddcaps); ddrval = directDraw_->GetCaps(&ddcaps, &helcaps); ATLASSERT(SUCCEEDED(ddrval)); ATLASSERT(ddrval == DD_OK);DDCAPS_NOHARDWARE if (ddrval != DD_OK)return 0; // bool b = (ddcaps.dwCaps & DDCAPS_OVERLAY);//false ddraw.h Display hardware can overlay (caps_.dwCaps & 0x00000800l) bool b1 = (helcaps.dwCaps & DDCAPS_OVERLAY); printf("OverlayManager,after CreatePrimarySurface before CreateOverlaySurface dwCaps=%d %d ", b, b1); std::cout << "Hello World! "; char xxx[256]; std::cin >> xxx; ::CoUninitialize(); return 0; }
拿到overlay真的这么难用吗?不知道错误到底出在哪里。