C# 如何在WPF中更改屏幕分辨率?

C# 如何在WPF中更改屏幕分辨率?,c#,wpf,screen,resolution,C#,Wpf,Screen,Resolution,如何在WPF中以编程方式更改屏幕分辨率? 我怎样才能获得可用分辨率的列表以供显示 我尝试尝试尝试本文中描述的示例:但System.Diagnostics命名空间中不存在Screen和Resolution类 C#/WPF Thanx.很抱歉给您添麻烦。我找到了Windows窗体的解决方案,并做了一些小改动 WPF解决方案 在窗口上放置两个列表框(listDevices和listSettings)和按钮(btnSave) 使用制度 使用System.Runtime.InteropServices

如何在WPF中以编程方式更改屏幕分辨率? 我怎样才能获得可用分辨率的列表以供显示

我尝试尝试尝试本文中描述的示例:但System.Diagnostics命名空间中不存在Screen和Resolution类

C#/WPF


Thanx.

很抱歉给您添麻烦。我找到了Windows窗体的解决方案,并做了一些小改动

WPF解决方案

在窗口上放置两个列表框(listDevices和listSettings)和按钮(btnSave)


使用制度
使用System.Runtime.InteropServices
使用System.Windows
使用System.Windows.Controls

public partial class MainWindow : Window
{
    [StructLayout(LayoutKind.Sequential)]
    public struct DISPLAY_DEVICE
    {
        public int cb;
        [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 32)]
        public string DeviceName;
        [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 128)]
        public string DeviceString;
        public int StateFlags;
        [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 128)]
        public string DeviceID;
        [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 128)]
        public string DeviceKey;

        public DISPLAY_DEVICE(int flags)
        {
            cb = 0;
            StateFlags = flags;
            DeviceName = new string((char)32, 32);
            DeviceString = new string((char)32, 128);
            DeviceID = new string((char)32, 128);
            DeviceKey = new string((char)32, 128);
            cb = Marshal.SizeOf(this);
        }
    }

    [StructLayout(LayoutKind.Sequential)]
    public struct DEVMODE
    {
        [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 32)]
        public string dmDeviceName;
        public short dmSpecVersion;
        public short dmDriverVersion;
        public short dmSize;
        public short dmDriverExtra;
        public int dmFields;
        public short dmOrientation;
        public short dmPaperSize;
        public short dmPaperLength;
        public short dmPaperWidth;
        public short dmScale;
        public short dmCopies;
        public short dmDefaultSource;
        public short dmPrintQuality;
        public short dmColor;
        public short dmDuplex;
        public short dmYResolution;
        public short dmTTOption;
        public short dmCollate;
        [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 32)]
        public string dmFormName;
        public short dmUnusedPadding;
        public short dmBitsPerPel;
        public int dmPelsWidth;
        public int dmPelsHeight;
        public int dmDisplayFlags;
        public int dmDisplayFrequency;
    }
    public MainWindow()
    {
        InitializeComponent();
        EnumDevices();
    }

    private void listDevices_SelectionChanged(object sender, SelectionChangedEventArgs e)
    {
        int devNum = listDevices.SelectedIndex;
        bool isMain = MainDevice(devNum);
        btnSet.IsEnabled = isMain; // enable only for the main device
        EnumModes(devNum);
    }

    private void btnSet_Click(object sender, RoutedEventArgs e)
    { //set selected display mode
        int devNum = listDevices.SelectedIndex;
        int modeNum = listSettings.SelectedIndex;
        DEVMODE d = GetDevmode(devNum, modeNum);
        if (d.dmBitsPerPel != 0 & d.dmPelsWidth != 0
            & d.dmPelsHeight != 0)
        {
            ChangeDisplaySettings(ref d, 0);
        }
    }

    private void EnumModes(int devNum)
    {
        listSettings.Items.Clear();

        string devName = GetDeviceName(devNum);
        DEVMODE devMode = new DEVMODE();
        int modeNum = 0;
        bool result = true;
        do
        {
            result = EnumDisplaySettings(devName,
                modeNum, ref devMode);

            if (result)
            {
                string item = DevmodeToString(devMode);
                listSettings.Items.Add(item);
            }
            modeNum++;
        } while (result);

        if (listSettings.Items.Count > 0)
        {
            DEVMODE current = GetDevmode(devNum, -1);

         //   int selected = listSettings.FindString(DevmodeToString(current));
            int selected = listSettings.Items.IndexOf(DevmodeToString(current));
            if (selected >= 0)
            {
                listSettings.SelectedIndex = selected;
             //   listSettings.SetSelected(selected, true);
            }
        }
    }

    private DEVMODE GetDevmode(int devNum, int modeNum)
    { //populates DEVMODE for the specified device and mode
        DEVMODE devMode = new DEVMODE();
        string devName = GetDeviceName(devNum);
        EnumDisplaySettings(devName, modeNum, ref devMode);
        return devMode;
    }

    private string DevmodeToString(DEVMODE devMode)
    {
        return devMode.dmPelsWidth.ToString() +
            " x " + devMode.dmPelsHeight.ToString() +
            ", " + devMode.dmBitsPerPel.ToString() +
            " bits, " +
            devMode.dmDisplayFrequency.ToString() + " Hz";
    }

    private void EnumDevices()
    { //populates Display Devices list
        this.listDevices.Items.Clear();
        DISPLAY_DEVICE d = new DISPLAY_DEVICE(0);

        int devNum = 0;
        bool result;
        do
        {
            result = EnumDisplayDevices(IntPtr.Zero,
                devNum, ref d, 0);

            if (result)
            {
                string item = devNum.ToString() +
                    ". " + d.DeviceString.Trim();
                if ((d.StateFlags & 4) != 0) item += " - main";
                this.listDevices.Items.Add(item);
            }
            devNum++;
        } while (result);
    }

    private string GetDeviceName(int devNum)
    {
        DISPLAY_DEVICE d = new DISPLAY_DEVICE(0);
        bool result = EnumDisplayDevices(IntPtr.Zero,
            devNum, ref d, 0);
        return (result ? d.DeviceName.Trim() : "#error#");
    }

    private bool MainDevice(int devNum)
    { //whether the specified device is the main device
        DISPLAY_DEVICE d = new DISPLAY_DEVICE(0);
        if (EnumDisplayDevices(IntPtr.Zero, devNum, ref d, 0))
        {
            return ((d.StateFlags & 4) != 0);
        } return false;
    }

    [DllImport("User32.dll")]
    private static extern bool EnumDisplayDevices(
        IntPtr lpDevice, int iDevNum,
        ref DISPLAY_DEVICE lpDisplayDevice, int dwFlags);

    [DllImport("User32.dll")]
    private static extern bool EnumDisplaySettings(
        string devName, int modeNum, ref DEVMODE devMode);

    [DllImport("user32.dll")]
    public static extern int ChangeDisplaySettings(
        ref DEVMODE devMode, int flags);
}


WPF屏幕分辨率来源:

很抱歉给您带来麻烦。我找到了Windows窗体的解决方案,并做了一些小改动

WPF解决方案

在窗口上放置两个列表框(listDevices和listSettings)和按钮(btnSave)


使用制度
使用System.Runtime.InteropServices
使用System.Windows
使用System.Windows.Controls

public partial class MainWindow : Window
{
    [StructLayout(LayoutKind.Sequential)]
    public struct DISPLAY_DEVICE
    {
        public int cb;
        [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 32)]
        public string DeviceName;
        [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 128)]
        public string DeviceString;
        public int StateFlags;
        [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 128)]
        public string DeviceID;
        [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 128)]
        public string DeviceKey;

        public DISPLAY_DEVICE(int flags)
        {
            cb = 0;
            StateFlags = flags;
            DeviceName = new string((char)32, 32);
            DeviceString = new string((char)32, 128);
            DeviceID = new string((char)32, 128);
            DeviceKey = new string((char)32, 128);
            cb = Marshal.SizeOf(this);
        }
    }

    [StructLayout(LayoutKind.Sequential)]
    public struct DEVMODE
    {
        [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 32)]
        public string dmDeviceName;
        public short dmSpecVersion;
        public short dmDriverVersion;
        public short dmSize;
        public short dmDriverExtra;
        public int dmFields;
        public short dmOrientation;
        public short dmPaperSize;
        public short dmPaperLength;
        public short dmPaperWidth;
        public short dmScale;
        public short dmCopies;
        public short dmDefaultSource;
        public short dmPrintQuality;
        public short dmColor;
        public short dmDuplex;
        public short dmYResolution;
        public short dmTTOption;
        public short dmCollate;
        [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 32)]
        public string dmFormName;
        public short dmUnusedPadding;
        public short dmBitsPerPel;
        public int dmPelsWidth;
        public int dmPelsHeight;
        public int dmDisplayFlags;
        public int dmDisplayFrequency;
    }
    public MainWindow()
    {
        InitializeComponent();
        EnumDevices();
    }

    private void listDevices_SelectionChanged(object sender, SelectionChangedEventArgs e)
    {
        int devNum = listDevices.SelectedIndex;
        bool isMain = MainDevice(devNum);
        btnSet.IsEnabled = isMain; // enable only for the main device
        EnumModes(devNum);
    }

    private void btnSet_Click(object sender, RoutedEventArgs e)
    { //set selected display mode
        int devNum = listDevices.SelectedIndex;
        int modeNum = listSettings.SelectedIndex;
        DEVMODE d = GetDevmode(devNum, modeNum);
        if (d.dmBitsPerPel != 0 & d.dmPelsWidth != 0
            & d.dmPelsHeight != 0)
        {
            ChangeDisplaySettings(ref d, 0);
        }
    }

    private void EnumModes(int devNum)
    {
        listSettings.Items.Clear();

        string devName = GetDeviceName(devNum);
        DEVMODE devMode = new DEVMODE();
        int modeNum = 0;
        bool result = true;
        do
        {
            result = EnumDisplaySettings(devName,
                modeNum, ref devMode);

            if (result)
            {
                string item = DevmodeToString(devMode);
                listSettings.Items.Add(item);
            }
            modeNum++;
        } while (result);

        if (listSettings.Items.Count > 0)
        {
            DEVMODE current = GetDevmode(devNum, -1);

         //   int selected = listSettings.FindString(DevmodeToString(current));
            int selected = listSettings.Items.IndexOf(DevmodeToString(current));
            if (selected >= 0)
            {
                listSettings.SelectedIndex = selected;
             //   listSettings.SetSelected(selected, true);
            }
        }
    }

    private DEVMODE GetDevmode(int devNum, int modeNum)
    { //populates DEVMODE for the specified device and mode
        DEVMODE devMode = new DEVMODE();
        string devName = GetDeviceName(devNum);
        EnumDisplaySettings(devName, modeNum, ref devMode);
        return devMode;
    }

    private string DevmodeToString(DEVMODE devMode)
    {
        return devMode.dmPelsWidth.ToString() +
            " x " + devMode.dmPelsHeight.ToString() +
            ", " + devMode.dmBitsPerPel.ToString() +
            " bits, " +
            devMode.dmDisplayFrequency.ToString() + " Hz";
    }

    private void EnumDevices()
    { //populates Display Devices list
        this.listDevices.Items.Clear();
        DISPLAY_DEVICE d = new DISPLAY_DEVICE(0);

        int devNum = 0;
        bool result;
        do
        {
            result = EnumDisplayDevices(IntPtr.Zero,
                devNum, ref d, 0);

            if (result)
            {
                string item = devNum.ToString() +
                    ". " + d.DeviceString.Trim();
                if ((d.StateFlags & 4) != 0) item += " - main";
                this.listDevices.Items.Add(item);
            }
            devNum++;
        } while (result);
    }

    private string GetDeviceName(int devNum)
    {
        DISPLAY_DEVICE d = new DISPLAY_DEVICE(0);
        bool result = EnumDisplayDevices(IntPtr.Zero,
            devNum, ref d, 0);
        return (result ? d.DeviceName.Trim() : "#error#");
    }

    private bool MainDevice(int devNum)
    { //whether the specified device is the main device
        DISPLAY_DEVICE d = new DISPLAY_DEVICE(0);
        if (EnumDisplayDevices(IntPtr.Zero, devNum, ref d, 0))
        {
            return ((d.StateFlags & 4) != 0);
        } return false;
    }

    [DllImport("User32.dll")]
    private static extern bool EnumDisplayDevices(
        IntPtr lpDevice, int iDevNum,
        ref DISPLAY_DEVICE lpDisplayDevice, int dwFlags);

    [DllImport("User32.dll")]
    private static extern bool EnumDisplaySettings(
        string devName, int modeNum, ref DEVMODE devMode);

    [DllImport("user32.dll")]
    public static extern int ChangeDisplaySettings(
        ref DEVMODE devMode, int flags);
}

WPF屏幕分辨率源: