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

eto*_*bot 34 c# winforms

如何检索运行C#Winform App的屏幕分辨率?

Pau*_*ams 75

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

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

Form myForm;
Screen myScreen = Screen.FromControl(myForm);
Rectangle area = myScreen.WorkingArea;
Run Code Online (Sandbox Code Playgroud)

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

  • Screen.WorkingArea为+1.我错误地使用了Screen.Bounds.如果可以,我会给你+2,提到Screen.FromControl而不是Screen.PrimaryScreen! (2认同)

ent*_*iat 7

给定的答案是正确的,就其而言.但是,当您将文本大小设置为超过125%时,Windows(和.NET)会开始大约相当于屏幕大小,以便为您进行自动缩放.

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


Nic*_*ick 6

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