如何获取我的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版本可能会有所不同。
到目前为止,这是我发现的唯一一种获取真正屏幕像素计数的方法,如果您不想全局关闭应用程序中的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.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 引用。
我还将其放在一个单独的类中,以避免与主代码发生冲突。