C# 虚拟屏幕宽度尺寸不准确

C# 虚拟屏幕宽度尺寸不准确,c#,wpf,C#,Wpf,下面是我的代码片段: int screenLeft = (int)SystemParameters.VirtualScreenLeft; int screenTop = (int)SystemParameters.VirtualScreenTop; int screenWidth = (int)SystemParameters.VirtualScreenWidth; int screenHeight = (int)SystemParameters.VirtualScreenHeight;

下面是我的代码片段:

 int screenLeft = (int)SystemParameters.VirtualScreenLeft;
 int screenTop = (int)SystemParameters.VirtualScreenTop;
 int screenWidth = (int)SystemParameters.VirtualScreenWidth;
 int screenHeight = (int)SystemParameters.VirtualScreenHeight;
 
 Bitmap bitmap_Screen = new Bitmap(screenWidth, screenHeight);
 Graphics g = Graphics.FromImage(bitmap_Screen);
 g.CopyFromScreen(screenLeft, screenTop, 0, 0, bitmap_Screen.Size);
 
 if (!Directory.Exists(screenshotDir))
 {
     Directory.CreateDirectory(screenshotDir);
 }
 bitmap_Screen.Save(fileLoc);
 
我正在尝试拍摄整个桌面的快照。只是当我的桌面大小为1920 x 1080时,
VirtualScreenWidth
VirtualScreenHeight
分别返回1536和800。所以快照只是捕获屏幕的一部分,而不是整个屏幕


我在这里已经发现了完全相同的问题,但是对于WPF和C来说,一般来说,我不理解所选的答案。

您的问题的答案实际上是您链接的问题的答案。你得到的尺寸不是像素,而是WPF“单位”是1/96。我猜很像答案中指出的,你的屏幕现在是125%缩放,所以公式是完全相同的。1536/96*120=1920像素


问题是,您正在使用此WPF单位测量值并将其传递到需要实际像素的方法中,因为它不使用WPF元素,而是使用通用Windows屏幕空间。如果您还获得了当前DPI,并对从
VirtualScreenWidth
和其他方法获得的值进行了适当的计算,您应该这是一个正确的屏幕截图。

你的问题的答案实际上是你链接的问题的答案。你得到的尺寸不是像素,而是WPF的“单位”,即1/96。我猜很像答案中指出的,你的屏幕现在是125%缩放,所以公式是完全一样的。1536/96*120=1920像素

问题是,您正在使用这个WPF单位度量并将其传递到一个需要实际像素的方法中,因为它使用的不是WPF元素,而是通用的Windows屏幕空间。如果您还获得了当前的DPI,并对从
VirtualScreenWidth
和其他方法获得的值进行了适当的计算,您应该会得到一个适当的屏幕截图