处理多个DPI屏幕

时间:2016-04-24 03:25:50

标签: c# wpf .net-4.5 dpi

我们假设我有两个屏幕,并排:

  1. 1920x1080 100% DPI

  2. 1360x768 125% DPI

  3. Screens

    对于我的Window,这意味着:

    1. 1920x1080:确定

    2. 1088x614:不行,由于比例因素,它除以1,25。

    3. 转到此:

      1. 1920x1080 + 1088x6143008x1080
      2. 我想使用CopyFromScreen / BitBlt方法。 这些方法忽略所有DPI信息,如果在高dpi屏幕内,LeftTop属性(例如窗口)无效。或者留给高dpi屏幕,因为它的行为类似于1个屏幕,例如:

        Screens inverted

        因此,每当我需要从一组至少有一个具有高DPI的屏幕中获取屏幕点时,它将返回一个较小的点。

        有没有办法从一组具有(至少一个)高DPI的屏幕中获得真实的(通过真实,忽略比例因子)XY信息?

        我已经尝试了托管PointToScreen和非托管ClientToScreen方法,这两种方法都产生了相同的"对"点。

        请阅读

        我想根据我的窗口位置截取屏幕截图。

        我有两个显示器,一个具有100%DPI,另一个具有125%DPI。

        如果我的窗口位于第一台显示器内,则基于我窗口的左/顶部属性的屏幕截图有效。

        如果我的窗口位于第二台显示器内,则屏幕截图不会占据正确位置!

        因为

        BitBlt API方法忽略了屏幕的缩放。例如:

        点100的屏幕截图; 100将是正确的,因为它在第一个屏幕内。

        点1950的截图; 100不对,因为它在第二个屏幕内。请注意,它在右边30个像素。

        为什么?

        如前所述,对于我的应用,125%DPI会将屏幕分辨率降低到1088x614,但对于BitBlt方法,它仍为1360x768

        所以我无法转换Left / Top属性,因为它会出错,因为左边有一个100%的DPI屏幕。

        Left属性的示例:

        我认为这是转换的正确方法:

        1920px + 50px:100%+ 125%:1920 + 62:1982px

        这是建议的版本:

        1920px + 50px:100%+ 125%:2400 + 62:2462px

        请参阅,如果我根据当前Left的DPI简单转换当前Window属性,在这种情况下我的第二个屏幕,我也将转换我的第一个值屏幕。这不应该发生。

0 个答案:

没有答案