Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 在XNA中获取支持的屏幕分辨率?_C#_.net_Xna - Fatal编程技术网

C# 在XNA中获取支持的屏幕分辨率?

C# 在XNA中获取支持的屏幕分辨率?,c#,.net,xna,C#,.net,Xna,如何在XNA中获得受支持的屏幕分辨率?比如,当你在windows中更改屏幕分辨率时,它不是给你一个所有可能选项的列表,而是给你其中的一些选项。我对XNA不是很了解,但我不认为有一个快速简单的功能。有一种方法可以使用旧的WinForms API,但我个人不想在其他应用程序中与之相联系,最简单的方法是使用本机函数 首先,定义将使用的本机结构: [StructLayout(LayoutKind.Sequential)] internal struct DEVMODE { private con

如何在XNA中获得受支持的屏幕分辨率?比如,当你在windows中更改屏幕分辨率时,它不是给你一个所有可能选项的列表,而是给你其中的一些选项。

我对XNA不是很了解,但我不认为有一个快速简单的功能。有一种方法可以使用旧的WinForms API,但我个人不想在其他应用程序中与之相联系,最简单的方法是使用本机函数

首先,定义将使用的本机结构:

[StructLayout(LayoutKind.Sequential)]
internal struct DEVMODE
{
    private const int CCHDEVICENAME = 0x20;
    private const int CCHFORMNAME = 0x20;
    [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 0x20)]
    public string dmDeviceName;
    public short dmSpecVersion;
    public short dmDriverVersion;
    public short dmSize;
    public short dmDriverExtra;
    public int dmFields;
    public int dmPositionX;
    public int dmPositionY;
    public int dmDisplayOrientation;
    public int dmDisplayFixedOutput;
    public short dmColor;
    public short dmDuplex;
    public short dmYResolution;
    public short dmTTOption;
    public short dmCollate;

    [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 0x20)]
    public string dmFormName;

    public short dmLogPixels;
    public int dmBitsPerPel;
    public int dmPelsWidth;
    public int dmPelsHeight;
    public int dmDisplayFlags;
    public int dmDisplayFrequency;
    public int dmICMMethod;
    public int dmICMIntent;
    public int dmMediaType;
    public int dmDitherType;
    public int dmReserved1;
    public int dmReserved2;
    public int dmPanningWidth;
    public int dmPanningHeight;
}
我们还需要定义我们将使用的两个本机函数:

[DllImport("user32.dll")]
private static extern bool EnumDisplaySettings(string lpszDeviceName, int iModeNum, ref DEVMODE lpDevMode);

[DllImport("user32.dll")]
private static extern int GetSystemMetrics(int nIndex);
最后,我们的函数列出所有屏幕分辨率,一个用于获取当前屏幕分辨率:

public static List<string> GetScreenResolutions()
{
    var resolutions = new List<string>();

    try
    {
        var devMode = new DEVMODE();
        int i = 0;

        while (EnumDisplaySettings(null, i, ref devMode))
        {
            resolutions.Add(string.Format("{0}x{1}", devMode.dmPelsWidth, devMode.dmPelsHeight));
            i++;
        }

        resolutions = resolutions.Distinct(StringComparer.InvariantCulture).ToList();
    }
    catch (Exception ex)
    {
        Console.WriteLine("Could not get screen resolutions.");
    }

    return resolutions;
}

public static string GetCurrentScreenResolution()
{
    int width = GetSystemMetrics(0x00);
    int height = GetSystemMetrics(0x01);

    return string.Format("{0}x{1}", width, height);
}
公共静态列表GetScreenResolutions()
{
var分辨率=新列表();
尝试
{
var devMode=new devMode();
int i=0;
while(EnumDisplaySettings(null、i、ref devMode))
{
Add(string.Format(“{0}x{1}”,devMode.dmPelsWidth,devMode.dmPelsHeight));
i++;
}
分辨率=分辨率.Distinct(StringComparer.InvariantCulture).ToList();
}
捕获(例外情况除外)
{
Console.WriteLine(“无法获取屏幕分辨率”);
}
返回决议;
}
公共静态字符串GetCurrentScreenResolution()
{
int width=GetSystemMetrics(0x00);
int height=GetSystemMetrics(0x01);
返回string.Format(“{0}x{1}”,宽度,高度);
}
只要用这个:

foreach (DisplayMode mode in GraphicsAdapter.DefaultAdapter.SupportedDisplayModes) {
    //mode.whatever (and use any of avaliable information)
}

但是它会给你很少的副本,因为它也考虑到了相应的重新刷新率,所以你可以将其也包括在内,或者做一些过滤。

虽然可以接受的答案是正确的,但是+1解释了如何独立于XNA做这样的事情。