我们假设我有两个屏幕,并排:
1920x1080
100%
DPI
1360x768
125%
DPI
对于我的Window
,这意味着:
1920x1080
:确定
1088x614
:不行,由于比例因素,它除以1,25。
转到此:
1920x1080
+ 1088x614
:3008x1080
我想使用CopyFromScreen
/ BitBlt
方法。
这些方法忽略所有DPI信息,如果在高dpi屏幕内,Left
和Top
属性(例如窗口)无效。或者留给高dpi屏幕,因为它的行为类似于1个屏幕,例如:
因此,每当我需要从一组至少有一个具有高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
属性,在这种情况下我的第二个屏幕,我也将转换我的第一个值屏幕。这不应该发生。