WPF - Graphics.CopyFromScreen 返回黑色图像

swift

1个回答

写回答

屏幕
屏幕

使用 WPF 中的 Graphics.CopyFromScreen 方法可以实现从屏幕上复制图像的功能。然而,在某些情况下,可能会遇到返回黑色图像的问题。本文将详细介绍这个问题,并提供解决方案。

问题描述

在使用 Graphics.CopyFromScreen 方法时,有时会遇到返回黑色图像的情况。这意味着复制的图像完全是黑色的,无法获取屏幕上的实际内容。这可能会导致应用程序无法正常工作,因为无法获取到正确的屏幕截图。

问题原因

返回黑色图像的问题可能是由于以下原因之一引起的:

1. 权限问题:如果应用程序没有足够的权限来访问屏幕内容,则无法正确复制屏幕图像。

2. DPI 缩放问题:在某些高 DPI(Dots Per Inch,每英寸点数)设置下,图像可能会被缩放,导致复制的图像变为黑色。

解决方案

针对上述问题,我们可以采取以下解决方案来解决返回黑色图像的问题:

1. 权限解决方案:

- 确保应用程序以管理员权限运行,以确保有足够的权限来访问屏幕内容。

- 使用 UAC(User Account Control,用户账户控制)提示来获取管理员权限。

2. DPI 缩放解决方案:

- 在应用程序的配置文件中,将 dpiAware 设置为 true,以告诉系统应用程序是 DPI 感知的。

- 使用 PresentationSource.FromVisual 方法获取 PresentationSource 对象,并使用它的 CompositionTarget.TransformToDevice 属性来获取 DPI 缩放比例。

- 将获取到的 DPI 缩放比例应用于 Graphics.CopyFromScreen 方法中的参数,以确保复制的图像不会被缩放。

下面是一个示例代码,演示了如何使用 DPI 缩放解决方案来正确复制屏幕图像:

csharp

using System;

using System.Drawing;

using System.Windows;

using System.Windows.Forms;

namespace CopyScreenImageExample

{

public partial class MAInWindow : Window

{

public MAInWindow()

{

InitializeComponent();

}

private void CopyScreenImage()

{

// 获取 PresentationSource 对象

PresentationSource source = PresentationSource.FromVisual(this);

// 获取 DPI 缩放比例

Matrix matrix = source.CompositionTarget.TransformToDevice;

double dpiScaleX = matrix.M11;

double dpiScaleY = matrix.M22;

// 获取屏幕尺寸

Rectangle screenBounds = Screen.PrimaryScreen.Bounds;

int screenWidth = (int)(screenBounds.Width * dpiScaleX);

int screenHeight = (int)(screenBounds.Height * dpiScaleY);

// 创建位图对象

using (Bitmap bitmap = new Bitmap(screenWidth, screenHeight))

{

// 创建 Graphics 对象

using (Graphics graphics = Graphics.FromImage(bitmap))

{

// 设置 Graphics 对象的 DPI 缩放比例

graphics.ScaleTransform((float)dpiScaleX, (float)dpiScaleY);

// 复制屏幕图像到位图对象

graphics.CopyFromScreen(screenBounds.X, screenBounds.Y, 0, 0, screenBounds.Size);

}

// 保存位图对象到文件

bitmap.Save("screenshot.png");

}

}

private void Button_Click(object sender, RoutedEventArgs e)

{

CopyScreenImage();

}

}

}

在上述示例代码中,我们首先使用 PresentationSource.FromVisual 方法获取 PresentationSource 对象。然后,通过该对象的 CompositionTarget.TransformToDevice 属性获取到 DPI 缩放比例。接下来,我们根据屏幕尺寸和 DPI 缩放比例创建一个位图对象,并使用 Graphics.CopyFromScreen 方法将屏幕图像复制到位图对象中。最后,我们将位图对象保存到文件中。

通过以上解决方案,我们可以解决返回黑色图像的问题,并正确地复制屏幕图像。希望本文对你有所帮助!

举报有用(4分享收藏

Copyright © 2025 IZhiDa.com All Rights Reserved.

知答 版权所有 粤ICP备2023042255号