Доброго времени суток, писав на 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);
}
}
}
}