有没有一种方法可以在C#中获取屏幕的本机分辨率?
我之所以问这个问题,是因为我有一些曲线,无论分辨率如何,它们看起来都非常重要。当屏幕不处于本机分辨率时,它们看起来与以前有些不同,我想显示一个警告说明情况。
有没有一种方法可以在C#中获取屏幕的本机分辨率?
我之所以问这个问题,是因为我有一些曲线,无论分辨率如何,它们看起来都非常重要。当屏幕不处于本机分辨率时,它们看起来与以前有些不同,我想显示一个警告说明情况。
根据我的经验,最好的解决方案是从显示器的EDID中提取信息。
如何获取本机分辨率的答案在这里:如何通过VB6.0从EDID文件中获取连接的显示器的本机分辨率?
我编写了一个小的JavaScript代码,可以从从第54个字节开始的8个字节中获取分辨率。
var dtd = 0;
var edid = new Uint8Array(8);
var i = 0;
edid[i++] = 0x0E;
edid[i++] = 0x1F;
edid[i++] = 0x00;
edid[i++] = 0x80;
edid[i++] = 0x51;
edid[i++] = 0x00;
edid[i++] = 0x1B;
edid[i++] = 0x30;
var horizontalRes = ((edid[dtd+4] >> 4) << 8) | edid[dtd+2] ;
var verticalRes = ((edid[dtd+7] >> 4) << 8) | edid[dtd+5];
console.log(horizontalRes+", "+verticalRes);
这里是C#版本:
static Point ExtractResolution(byte [] edid)
{
const int dtd = 54;
var horizontalRes = ((edid[dtd + 4] >> 4) << 8) | edid[dtd + 2];
var verticalRes = ((edid[dtd + 7] >> 4) << 8) | edid[dtd + 5];
return new Point(horizontalRes, verticalRes);
}
通常情况下,最大分辨率是液晶显示器的原生分辨率。但并非总是如此。如果我们能利用它,获得最大分辨率就足够了。
可以通过以下方式获取最大分辨率:
[DllImport("user32.dll")]
private static extern int EnumDisplaySettings(string deviceName, int modeNum, ref DeviceMode devMode);
/// <summary>
/// Gets the max resolution + refresh rate supported by specific display
/// </summary>
/// <param name="deviceName">Device name(System.Windows.Forms.Screen.DeviceName)</param>
/// <param name="dispWidth">Width of the display</param>
/// <param name="dispHeight">Height of the display</param>
/// <param name="refreshRate">Refresh rate of the display</param>
/// <returns></returns>
public static void GetMaxResolutionWithRefreshRate(string deviceName, out int dispWidth, out int dispHeight, out int refreshRate)
{
dispWidth = dispHeight = refreshRate = 0;
DeviceMode deviceMode = new DeviceMode();
for (int i = 0; Win32.EnumDisplaySettings(deviceName, i, ref deviceMode) != 0; i++)
{
if (deviceMode.dmPelsWidth > dispWidth || (deviceMode.dmPelsWidth == dispWidth && deviceMode.dmPelsHeight >= dispHeight && deviceMode.dmDisplayFrequency >= refreshRate))
{
dispWidth = deviceMode.dmPelsWidth;
dispHeight = deviceMode.dmPelsHeight;
refreshRate = deviceMode.dmDisplayFrequency;
}
}
}
public static void GetMaxResolutionWithRefreshRate(out int dispWidth, out int dispHeight, out int refreshRate)
{
GetMaxResolutionWithRefreshRate(null, out dispWidth, out dispHeight, out refreshRate);
}
试试这样做:
GraphicsAdapter.DefaultAdapter.CurrentDisplayMode.Width
GraphicsAdapter.DefaultAdapter.CurrentDisplayMode.Height
Rectangle resolution = Screen.PrimaryScreen.Bounds;
现在让我们来改变分辨率。
请查看这个链接。
Screen screen = Screen.PrimaryScreen;
int S_width=screen.Bounds.Width;
int S_height=screen.Bounds.Height;
Screen class
告诉我分辨率为1440x900。问题是DWM也说DPI为96,在大多数情况下这很好,但如果您需要知道本机分辨率,则Screen
无法帮助您。 - The Muffin Manvar someScreen = Screen.AllScreens[i];
var mainScreen = Screen.PrimaryScreen;
屏幕有一个范围(总体)和一个工作区(净)的矩形。
再次考虑,这只会告诉您当前分辨率。不过,正如已经评论的那样,您确实想知道宽高比。