在DLL中使用Screen.Bounds-输出不一致

时间:2019-12-01 13:13:49

标签: c# wpf .net-4.5

在我的WPF应用程序中,我必须获得所有连接屏幕的分辨率,包括缩放比例。我发现Windows窗体包含此功能( Screen 类),但WPF不包含。为了避免混淆WinForms和WPF代码,我将此功能外包给了.NET Framework DLL。这是一个代码示例,用于获取第一个屏幕(在DLL内部)的缩放分辨率:

using System.Windows.Forms;

namespace Resolution
{
  public class FirstScreen
  {
    public string GetResolution()
    {
        return Screen.AllScreens[0].Bounds.Width.ToString() + "x" + Screen.AllScreens[0].Bounds.Height.ToString();
    }
  }
}

结果(使用具有125%缩放比例的全高清屏幕):

  • 如果将DLL嵌入到WPF应用程序中,则始终会得到未缩放的屏幕尺寸(1920x1080)。
  • 如果将DLL嵌入C#控制台应用程序中,则始终可以得到缩放后的大小(1536x864)。

为什么使用相同的DLL会得到不同的结果?如果这是错误的方法,如何在WPF中获取所有屏幕的缩放尺寸?

编辑:

这是我的简化WPF应用程序的代码(用于重建问题):

using System.Windows;
using Resolution;

namespace ScreenResProblem
{
  public partial class MainWindow : Window
  {
    public MainWindow()
    {
      InitializeComponent();
    }

    private void Window_Loaded(object sender, RoutedEventArgs e)
    {
      FirstScreen fs = new FirstScreen();
      tb.Text = fs.GetResolution();
    }
  }
}

这里是控制台应用程序的代码:

using System;
using Resolution;

namespace ConsoleRes
{
  class Program
  {
    static void Main(string[] args)
    {
      FirstScreen fs = new FirstScreen();
      Console.WriteLine(fs.GetResolution());
      Console.ReadKey();
    }
  }
}

0 个答案:

没有答案