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

44

如何获取我的C# Winform应用程序运行的屏幕分辨率?

5个回答

91

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

如果有多个监视器,则需要从表单中获取屏幕,即:

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

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


4
+1 for Screen.WorkingArea。我之前错误地使用了Screen.Bounds。如果可能的话,我会给您+2分,因为您提到了Screen.FromControl而不是Screen.PrimaryScreen! - ToolmakerSteve

16

给出的答案是正确的,只要它所覆盖的范围。然而,当你将文本大小设置为超过125%时,Windows(和.NET)开始虚假报告屏幕的大小,以便为你进行自动缩放。

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

到目前为止,这是我发现的唯一一种获取真正屏幕像素计数的方法,如果您不想全局关闭应用程序中的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);

如果您的窗口有缩放因子(100%/ 125%/ 150%/ 200%),您能否获取真实的屏幕尺寸? - Kiquenet
@Kiquenet - 是的,上面的代码获取了屏幕的实际(原始)像素数,与任何缩放无关。请注意,示例代码是针对主屏幕的 - 如果您想要从非主屏幕获得像素计数,则需要修改 GetDC 调用。 - entiat
你的解决方案和此方案一起帮助我按照每个监视器的基础来解决了这个问题。 - Uwe Keim

5
使用Screen类,并查询Bounds属性。Screen类有一个静态属性Primary Screen,还有另一个静态属性返回系统连接的所有屏幕的列表。

0
Screen.PrimaryScreen.WorkingArea.Size()

0

以下是我使用的代码,用于获取鼠标指针所在的工作区屏幕分辨率。我可以启动程序,然后将鼠标移到另一台监视器上,并获取该分辨率。

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 引用。
我还将其放在一个单独的类中,以避免与主代码发生冲突。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接