还有其他类似的问题,但它们只处理显示的应用程序的屏幕截图。我的应用程序是透明的,所以我需要截图显示的窗口和它背后的背景
这个功能正确地在我的主监视器上截屏了应用程序,但当它转到另一个监视器时,屏幕截图的形状错误,完全是黑色的。如果这个窗口部分在监视器上,那么它仍然可以工作,但一旦另一个监视器控制了这个窗口,我就会得到黑色屏幕截图。如何使屏幕截图正确呈现?
这是我的功能:
public void SaveSnapshot2(int count)
{
string imageName = "image" + count.ToString() + ".jpeg";
string basePath = Path.GetFullPath(Environment.CurrentDirectory);
string folderPath = Path.Combine(basePath, "Snapshots");
string fullPath = Path.Combine(folderPath, imageName);
if (!Directory.Exists(folderPath))
{
Directory.CreateDirectory(folderPath);
}
System.Windows.Point relativeWindowPosition = App.Current.MainWindow.PointToScreen(new System.Windows.Point(0, 0));
System.Windows.Point relativeBottomRightWindowPosition = App.Current.MainWindow.PointToScreen(new System.Windows.Point(App.Current.MainWindow.Width, App.Current.MainWindow.Height));
System.Windows.Point actualWidthHeight = new System.Windows.Point((relativeBottomRightWindowPosition.X - relativeWindowPosition.X), (relativeBottomRightWindowPosition.Y - relativeWindowPosition.Y));
System.Drawing.Size convertedSize = new System.Drawing.Size((int)actualWidthHeight.X, (int)actualWidthHeight.Y);
Bitmap Screenshot = new Bitmap((int)actualWidthHeight.X, (int)actualWidthHeight.Y, PixelFormat.Format32bppArgb);
using (Graphics g = Graphics.FromImage(Screenshot))
{
// Crops the screenshot
// The relativePoint is where the top left corner of the image is. This is correct.
g.CopyFromScreen((int)relativeWindowPosition.X, (int)relativeWindowPosition.Y, 0, 0, convertedSize); // or (0, 0, 0, 0, Screenshot.Size) to get the whole bitmap image
}
try
{
Screenshot.Save(fullPath, ImageFormat.Jpeg);
}
catch (Exception ex)
{
MessageBox.Show(ex.Message + ", the image did not save.");
}
Screenshot.Dispose();
}
说出要点的名字很困难。我希望它们足够清楚。
当一个窗口在一个单独的监视器上时,坐标系会改变吗?我这样做对吗?
我想您还没有在应用程序清单中声明DPI感知。当你有多个不同DPI的显示器时,这是一个常见的陷阱。如果没有,大多数与屏幕坐标相关的方法和函数将返回不正确的值,因此基于这些值的计算将被搞砸。
要解决此问题,请添加声明DPI感知的应用程序清单。请参阅设置进程的默认DPI感知。PerMonitorV2
是"每监视器DPI"的关键。