Задать вопрос
@al1vate

Как сменить разрешение(на довольно маленькое 256x256 px) на 2-ом экране?

Доброго времени суток, писав на C#, столкнулся со следующей проблемой. У меня есть контроллер для LED-экрана, и в системе он отображается как экран 1920x1080, хотя фактическое разрешение дисплея 256x256. Я пытаюсь выставить нативное разрешение такое, как и фактическое. Т. к. LED-дисплей в системе отображается как второй монитор, я использовал EnumDisplaySettings и ChangeDisplaySettingsEx, но по непонятным для меня причинам изменения не происходят от слова совсем.
Используемый контроллер: novastar TB2-4G
ПО: NovaLCT
Код:
using System;
using System.Runtime.InteropServices;
using System.Windows.Forms;

[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Auto)]
public struct DEVMODE1
{
    private const int CCHDEVICENAME = 32;
    private const int CCHFORMNAME = 32;

    [MarshalAs(UnmanagedType.ByValTStr, SizeConst = CCHDEVICENAME)]
    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 dmColor;
    public int dmDuplex;
    public int dmYResolution;
    public int dmTTOption;
    public int dmCollate;
    [MarshalAs(UnmanagedType.ByValTStr, SizeConst = CCHFORMNAME)]
    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;
}

class User32
{
    [DllImport("user32.dll")]
    public static extern bool EnumDisplaySettings(string deviceName, int modeNum, ref DEVMODE1 devMode);

    [DllImport("user32.dll")]
    public static extern int ChangeDisplaySettingsEx(string deviceName, ref DEVMODE1 devMode, IntPtr hwnd, int flags, IntPtr lParam);

    public const int ENUM_CURRENT_SETTINGS = -1;
    public const int CDS_UPDATEREGISTRY = 0x01;
    public const int CDS_TEST = 0x02;
    public const int DISP_CHANGE_SUCCESSFUL = 0;
    public const int DISP_CHANGE_RESTART = 1;
    public const int DISP_CHANGE_FAILED = -1;
}
namespace Resolution
{
	class CResolution
	{
		public CResolution(int width,int height)
		{

            Screen secondMonitor = Screen.AllScreens[1];
            string monitorName = secondMonitor.DeviceName;
            MessageBox.Show($"Попытка изменения разрешения для: {monitorName}");

            DEVMODE1 dm = new DEVMODE1();
            dm.dmSize = (short)Marshal.SizeOf(typeof(DEVMODE1));

            // Проверяем, удалось ли получить настройки второго монитора
            if (User32.EnumDisplaySettings(monitorName, User32.ENUM_CURRENT_SETTINGS, ref dm))
            {
                MessageBox.Show($"Текущее разрешение второго монитора: {dm.dmPelsWidth}x{dm.dmPelsHeight}");

                dm.dmPelsWidth = (int)(uint)width;
                dm.dmPelsHeight = (int)(uint)height;

                int iRet = User32.ChangeDisplaySettingsEx(monitorName, ref dm, IntPtr.Zero, User32.CDS_UPDATEREGISTRY, IntPtr.Zero);

                if (iRet == User32.DISP_CHANGE_SUCCESSFUL)
                {
                    MessageBox.Show("Разрешение успешно изменено!", "Успех", MessageBoxButtons.OK, MessageBoxIcon.Information);
                }
                else if (iRet == User32.DISP_CHANGE_RESTART)
                {
                    MessageBox.Show("Необходимо перезагрузить компьютер для применения изменений.", "Перезагрузка", MessageBoxButtons.OK, MessageBoxIcon.Warning);
                }
                else
                {
                    MessageBox.Show($"Ошибка при изменении разрешения! Код ошибки: {iRet}", "Ошибка", MessageBoxButtons.OK, MessageBoxIcon.Error);
                }
            }
            else
            {
                MessageBox.Show("Не удалось получить настройки дисплея.", "Ошибка", MessageBoxButtons.OK, MessageBoxIcon.Error);
            }
        }
    }
}
  • Вопрос задан
  • 57 просмотров
Подписаться 1 Простой 3 комментария
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы