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
和其他方法获得的值进行了适当的计算,您应该会得到一个适当的屏幕截图