C# 和 Ubuntu - 如何获取主屏幕的大小?

Posted

技术标签:

【中文标题】C# 和 Ubuntu - 如何获取主屏幕的大小?【英文标题】:C# and Ubuntu - How do I get size of primary screen? 【发布时间】:2013-12-08 11:29:04 【问题描述】:

我正在尝试确定主屏幕的大小,以便捕捉它的图像。我的设置是一台具有 1600x900 显示屏的笔记本电脑和一个 1920x1080 的外接显示器。获取大小的代码在 Windows 上运行良好,但在 Ubuntu 上给出错误结果(使用 MonoDevelop)。

    Rectangle capture_rect = System.Windows.Forms.Screen.PrimaryScreen.Bounds;
    Console.WriteLine("width=0 height=1", capture_rect.Height, capture_rect.Width);

在 Ubuntu 上的结果是“width=3520 height=1080”。如果我断开外接显示器,我会得到正确的结果,即“width=1600 height=900”。知道为什么我在具有多个显示器的 Ubuntu 上得到错误的值吗?

【问题讨论】:

显然,Ubuntu 认为您的外接显示器是主屏幕。您是否查看了 Ubuntu 的屏幕属性以确认其配置是否符合您的预期(外部显示器不是主屏幕)? 返回值 3520x1080 是一个包含两个显示器大小的矩形。如果我转到系统设置 > 显示器,它不会说明主显示器和辅助显示器,但我的“启动器放置”是为我的笔记本电脑显示器设置的。还有其他地方我应该寻找屏幕属性吗? 很遗憾,我在 Mono/Ubuntu 方面没有太多经验,而且我现在没有 Ubuntu 计算机;这只是一个通用建议(即,最可能的问题是 PrimaryScreen.Bounds 实际上是正确计算的,但它指向其他屏幕)。在您的情况下,我会对 Screen 类识别的所有屏幕进行一些测试,以查看它们是如何存储/识别的;也会在 Ubuntu 论坛上做一些研究。很抱歉,但无法提供进一步的帮助。 如果你遍历 Screen.AllScreens 会发生什么?里面还有数据吗? Screen.AllScreens 只有一个条目,和 Screen.PrimaryScreen 一样。 【参考方案1】:

我没有使用 .NET 来获取屏幕尺寸,而是使用 Linux “xrandr”。这是我的代码:

public Rectangle GetDisplaySize()

    // Use xrandr to get size of screen located at offset (0,0).
    System.Diagnostics.Process p = new System.Diagnostics.Process();
    p.StartInfo.UseShellExecute = false;
    p.StartInfo.RedirectStandardOutput = true;
    p.StartInfo.FileName = "xrandr";
    p.Start();
    string output = p.StandardOutput.ReadToEnd();
    p.WaitForExit();
    var match = System.Text.RegularExpressions.Regex.Match(output, @"(\d+)x(\d+)\+0\+0");
    var w = match.Groups[1].Value;
    var h = match.Groups[2].Value;
    Rectangle r = new Rectangle();
    r.Width = int.Parse(w);
    r.Height = int.Parse(h);
    Console.WriteLine ("Display Size is 0 x 1", w, h);
    return r;

【讨论】:

以上是关于C# 和 Ubuntu - 如何获取主屏幕的大小?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 WPF 中获取当前屏幕的大小?

C# WinForm如何获取窗口最大可实际显示的宽高? 比如1600*900的屏幕,最大化时窗口

C#窗体根据分辨率自动调整大小?

Ubuntu下如何调整主分区大小

获取我的主屏幕小部件的大小

c#如何使背景图片自动适应屏幕都大小