首页 > 解决方案 > LoadCursor 和混合 DPI 多显示器

问题描述

当该LoadCursor函数用于从资源加载游标时,结果HCURSOR可以在不同的监视器上使用,并且始终以正确的大小显示。

即:通常:

但是,当从内存以编程方式创建游标时(例如使用LookupIconIdFromDirectoryExand CreateIconFromResourceEx),生成的游标具有固定的分辨率。这意味着它在混合 DPI 多显示器设置中的至少一台显示器上以错误的尺寸显示。

我还检查了LoadCursorFromFile它,它也提供了这种动态分辨率行为,例如LoadCursor.

有没有办法以编程方式创建一个游标,该游标根据显示在哪个监视器上动态切换?加载的光标以不同的方式工作在幕后发生了什么魔力LoadCursor

标签: windowswinapihidpi

解决方案


经过大量实验,我终于发现 WPF 可以从资源和内存流中加载游标,并在scaleWithDpi使用该选项时获得正确的 DPI 行为:

public Cursor(Stream cursorStream, bool scaleWithDpi)

查看参考源,它最终出现在函数中,该函数LoadFromStream通过将流写入临时文件并从文件中加载来加载流。 见源

总结一下:

  • 似乎获得像这样的动态 DPI 光标的唯一方法是使用 Win32 本机资源加载函数并从文件加载。您似乎无法使用此行为直接从内存中加载游标。
  • 此行为的“动态 dpi”部分似乎与LR_DEFAULTSIZE传递给LoadImage函数的标志有关。

推荐阅读