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

如何从C#winform应用程序检索屏幕分辨率?,c#,winforms,C#,Winforms,如何检索运行C#Winform应用程序的屏幕分辨率?使用screen类并查询属性。Screen类有一个静态属性和另一个返回的静态属性。是否只需要标准应用程序将使用的区域,即不包括Windows任务栏和固定窗口?如果是,请使用。否则,请使用 如果有多个监视器,则需要从窗体中获取屏幕,即 Form myForm; Screen myScreen = Screen.FromControl(myForm); Rectangle area = myScreen.WorkingArea; 如果要知道哪个是

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

使用screen类并查询属性。Screen类有一个静态属性和另一个返回的静态属性。

是否只需要标准应用程序将使用的区域,即不包括Windows任务栏和固定窗口?如果是,请使用。否则,请使用

如果有多个监视器,则需要从窗体中获取屏幕,即

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

如果要知道哪个是主显示屏幕,请使用属性。此外,您还可以从属性中获得屏幕列表。

给出的答案是正确的,因为它是正确的。但是,当您将文本大小设置为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);

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

内部静态无效GetScreenResolution(参考双屏幕X,参考双屏幕Y)
{
Screen myScreen=Screen.FromPoint(光标位置);
System.Drawing.Rectangle area=myScreen.WorkingArea;
screenX=面积、宽度;
屏幕Y=面积、高度;
}
也许不是最好的解决方案,但我可以生成一个缩放因子并使用它缩放我的控件

我在一个WPF程序中使用了它,我必须添加一个参考系统。Windows.Forms

我还将它放在一个单独的类中,这样我的主代码中就不会出现冲突。

+1 for Screen.WorkingArea。我错误地使用了Screen.Bounds。如果可以的话,我会给你+2,因为你提到了Screen.FromControl而不是Screen.PrimaryScreen!如果你的窗口有比例因子(100%/125%/150%/200%),你能得到真实的屏幕大小吗?
[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);