IDisplayInformationStaticsInterop::GetForWindow 方法(windows.graphics.display.interop.h)

检索指定窗口的 DisplayInformation 对象。 GetForWindow 始终分配并返回新的 DisplayInformation

语法

HRESULT GetForWindow(
  HWND   window,
  REFIID riid,
  void   **displayInfo
);

参数

window

类型:[in] HWND

窗口的句柄。

riid

类型:[in] REFIID

DisplayInformation 类的 GUID

displayInfo

类型:[iid_is][retval][out] void**

指向内存块的指针,该块接收指向返回 DisplayInformation 对象的指针。

返回值

类型:HRESULT

如果函数成功,则返回 S_OK。 否则,它将返回 HRESULT错误代码

言论

因此,DisplayInformation 可以处理窗口移动和 DPI 更改消息,它会挂钩 HWND的消息循环。 为了确保顺利进行,GetForWindow 具有以下要求:

  • 窗口 的参数必须是当前线程拥有的顶级窗口的 HWND
  • 当前线程必须运行 Windows.System.DispatcherQueue 才能接收事件。
  • 当前线程可以是 MTA 或 STA。

你负责:缓存创建的 DisplayInformation,前提是 窗口 的参数是相关的;取消注册事件处理程序;并删除最后一个引用以销毁 DisplayInformation 实例。

例子

呈现宽色域和高动态范围内容的应用对于动态调整以动态调整监视器条件的应用至关重要;或在监视器之间移动时。 在笔记本电脑上,用户可以调整屏幕的亮度,并且可以调整提供给应用的音调映射参数。

// It's safe, and recommended, to cache the DisplayInformation created from an HWND,
// since it safely provides the latest information and event handlers for when
// changes take place.

#include <Windows.Graphics.Display.Interop.h>
#include <winrt/Windows.Graphics.Display.h>
using namespace winrt::Windows::Graphics::Display;
...
void ReadHdrParametersFromDisplayInformation(HWND myWindow)
{
    auto factory{ winrt::get_activation_factory<DisplayInformation,
        IDisplayInformationStaticsInterop>() };

    DisplayInformation displayInfo{ nullptr };

    winrt::check_hresult(
        factory->GetForWindow(
            myWindow,
            winrt::guid_of<DisplayInformation>(),
            winrt::put_abi(displayInfo)
        )
    );

    auto colorInfo{ displayInfo.GetAdvancedColorInfo() };
    // Here you can read colorInfo properties such as:
    // * CurrentAdvancedColorKind
    // * RedPrimary, BluePrimary, GreenPrimary, WhitePoint
    // * MinLuminanceInNits, MaxLuminanceInNits
    // * MaxAverageFullFrameLuminanceInNits, SdrWhiteLevelInNits
    // ... and adapt your rendering.

    // You can also subscribe event handlers to listen for changes:
    displayInfo.AdvancedColorInfoChanged(
        [&](auto sender, auto args)
        {
            // Handle the event.
        }
    );

    // Cache the DisplayInformation object for as long as your window
    // is alive: it always provides fresh data for your window.
}

要求

要求 价值
最低支持的客户端 Windows 11 内部版本 22621
标头 windows.graphics.display.interop.h