D3DKMTOpenAdapterFromHdc 函数 (d3dkmthk.h)
D3DKMTOpenAdapterFromHdc 函数将设备上下文句柄(HDC)映射到图形适配器句柄,如果适配器包含多个监视器输出,则映射到其中一个输出。
语法
NTSTATUS D3DKMTOpenAdapterFromHdc(
D3DKMT_OPENADAPTERFROMHDC *unnamedParam1
);
参数
unnamedParam1
pData [in, out]
指向 D3DKMT_OPENADAPTERFROMHDC 结构的指针,该结构描述执行映射所需的参数。
返回值
D3DKMTOpenAdapterFromHdc 返回以下值之一:
返回代码 | 描述 |
---|---|
STATUS_SUCCESS | 映射已成功执行。 |
STATUS_NO_MEMORY | 内核耗尽了资源,使它能够打开另一个句柄。 |
STATUS_INVALID_PARAMETER | 已验证并确定参数不正确,或者未使用 Windows Vista 显示驱动程序模型。 |
此函数还可以返回其他 NTSTATUS 值。
言论
图形适配器对应于视频卡。 监视器输出对应于视频卡上的头。 具有单个视频卡的系统仅包含一个适配器。 但是,如果视频卡支持多个头,则它支持向多个监视器输出。 使用 D3DKMTCloseAdapter 函数以避免资源泄漏。
例子
下面的代码示例演示 OpenGL ICD 如何使用 D3DKMTOpenAdapterFromHdc 从 HDC 检索图形适配器句柄和主监视器的输出。
HRESULT GetPrimaryAdapterHandle(HANDLE* phAdapter, UINT* pOutput)
{
D3DKMT_OPENADAPTERFROMHDC OpenAdapterData;
DISPLAY_DEVICE dd;
HDC hdc;
int i;
*phAdapter = NULL;
*pOutput = 0;
memset(&dd, 0, sizeof (dd));
dd.cb = sizeof dd;
for (i = 0; EnumDisplayDevicesA(NULL, i, &dd, 0); ++i) {
if (dd.StateFlags & DISPLAY_DEVICE_PRIMARY_DEVICE) {
break;
}
}
hdc = CreateDC (NULL, dd.DeviceName, NULL, NULL);
if (hdc == NULL) {
return E_FAIL;
}
OpenAdapterData.hDc = hdc;
if (NT_SUCCESS((*pfnKTOpenAdapterFromHdc)(&OpenAdapterData))) {
DeleteDC(hdc);
*phAdapter = OpenAdapterData.hAdapter;
*pOutput = OpenAdapterData.VidPnSourceId;
return S_OK;
}
DeleteDC(hdc);
return E_FAIL;
}
要求
要求 | 价值 |
---|---|
最低支持的客户端 | Windows Vista |
目标平台 | 普遍 |
标头 | d3dkmthk.h (包括 D3dkmthk.h) |
库 | Gdi32.lib |
DLL | Gdi32.dll |