繁体   English   中英

如何从 C# winform 应用程序中检索屏幕分辨率?

[英]How to retrieve the Screen Resolution from a C# winform app?

如何检索运行 C# Winform 应用程序的屏幕分辨率?

您是否只需要标准应用程序将使用的区域,即不包括 Windows 任务栏和停靠窗口? 如果是这样,请使用Screen.WorkingArea 属性 否则,请使用Screen.Bounds

如果有多个显示器,则需要从表单中抓取屏幕,即

Form myForm;
Screen myScreen = Screen.FromControl(myForm);
Rectangle area = myScreen.WorkingArea;

如果您想知道哪个是主显示屏幕,请使用Screen.Primary属性。 此外,您可以从Screen.AllScreens属性获取屏幕列表。

就目前而言,给出的答案是正确的。 但是,当您将文本大小设置为大于 125% 的任何值时,Windows(和 .NET)开始对屏幕大小进行调整,以便为您进行自动缩放。

大多数情况下,这不是问题 - 您通常希望 Windows 和 .NET 来执行此操作。 但是,如果您确实需要知道屏幕上的实际像素数(例如,您想直接绘制到桌面 DC),则可以执行以下操作。 我只在Win10上试过这个。 其他 Windows 版本上的 YMMV。

到目前为止,如果您不想在应用程序中全局关闭 DPI 感知,这是我发现获得真实屏幕像素数的唯一方法。 请注意,此示例获取主要显示大小 - 您需要对其进行修改以获取其他屏幕。

[DllImport("User32.dll")]
static extern IntPtr GetDC(IntPtr hwnd);

[DllImport("User32.dll")]
static extern int ReleaseDC(IntPtr hwnd, IntPtr dc);

[DllImport("gdi32.dll")]
static extern int GetDeviceCaps(IntPtr hdc, int nIndex);

IntPtr primary = GetDC(IntPtr.Zero);
int DESKTOPVERTRES = 117;
int DESKTOPHORZRES = 118;
int actualPixelsX = GetDeviceCaps(primary, DESKTOPHORZRES);
int actualPixelsY = GetDeviceCaps(primary, DESKTOPVERTRES);
ReleaseDC(IntPtr.Zero, primary);

使用 Screen 类,并询问Bounds属性。 Screen 类有一个用于Primary Screen的静态属性,以及另一个返回附加到系统的所有屏幕列表的静态属性。

Screen.PrimaryScreen.WorkingArea.Size()

这是我用来获取鼠标指针所在工作区屏幕分辨率的方法。 我可以启动我的程序,然后将鼠标移到另一台显示器上并获得该分辨率。

internal static void GetScreenResolution(ref double screenX, ref double screenY)
{
    Screen myScreen = Screen.FromPoint(Cursor.Position);
    System.Drawing.Rectangle area = myScreen.WorkingArea;
    screenX = area.Width;
    screenY = area.Height;   
}

也许不是最好的解决方案,但我可以生成一个缩放因子并使用它来缩放我的控件。

我在 WPF 程序中使用了它,我不得不添加一个参考 System.Windows.Forms
我也把它放在一个单独的类中,这样我的主代码中就不会发生冲突。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM