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)
Library Gdi32.lib
DLL Gdi32.dll

另请参阅

D3DKMT_OPENADAPTERFROMHDC