很久以前使用过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真的这么难用吗?不知道错误到底出在哪里。