Forum

Пожалуйста or Регистрация для создания сообщений и тем.

Console Framework 4.5 Информация по монитору и его разрешение. [Решено]

Доброго всем дня.
Прошу помощи.
Нужно реализовать получение разрешения монитора.

Пробовал подход как пишут в msdn и на различных форумах, боюсь поломать гугл уже. (((

private void ScreenResolution()       
  {             
double currentHeight = SystemParameters.PrimaryScreenHeight;            
double currentWidth = SystemParameters.PrimaryScreenWidth;             
loger.Info("Primary Current Screen Resolution: " + currentWidth + " x " + currentHeight); 
  }

Проблема в том что когда запускаю как обычное консольное приложение то результат возвращается корректный:
06.10.2021 04:35:55 [INFO] Primary Current Screen Resolution: 2560 x 1080

Однако когда приложение запускаю как службу windows то результат возвращается мне совершенно непонятным.

06.10.2021 04:35:55 [INFO] Primary Current Screen Resolution: 1024 x 768

Пробовал так-же использовать такой подход.

using System.Drawing;
 //.... 
Size resolution = System.Windows.Forms.Screen.PrimaryScreen.Bounds.Size; 
loger.Info(resolution.Width); loger.Info(resolution.Height);

Уже посещают мысли прибегнуть к костылям, получить данные через CMD или PowerShell. (((

Добрый день 🖐
Зачем запускаете через службу?

Цитата: Сергей от 07.10.2021, 14:28

Добрый день 🖐
Зачем запускаете через службу?

Задача стоит чтобы установить на все терминалы в сети агента (службу) который собирает некоторые данные, в том числе и разрешение экрана.
Агент результат сбора отправляет данные в мониторинг Zabbix.
Разрешение экрана это важный параметр который нужно отслеживать чтобы картинка которая транслируется на мониторе терминала соответствовала некоторым параметрам.

Добрый день.
А СкопированоScreen.PrimaryScreen.Bounds.Width и СкопированоScreen.PrimaryScreen.Bounds.Height что возвращают? При быстром гуглении чаще всего такой вариант предлагается.

Цитата: Adler от 07.10.2021, 14:49

А СкопированоScreen.PrimaryScreen.Bounds.Width и СкопированоScreen.PrimaryScreen.Bounds.Height что возвращают? При быстром гуглении чаще всего такой вариант предлагается.

Данный подход тоже пробовал.

static void Main(string[] args)
{
var width = Screen.PrimaryScreen.Bounds.Width;
var heidth = Screen.PrimaryScreen.Bounds.Height;
Console.WriteLine(width);
Console.WriteLine(heidth);
Console.ReadKey();
}

Ответ:

07.10.2021 15:08:36    [INFO]    Primary Current Screen Resolution: 1024 x 768

А как только запускаю как службу то получаю снова не понятно что.

07.10.2021 15:08:36    [INFO]    Primary Current Screen Resolution: 1024 x 768

При гуглении наткнулся еще на один такой вариант.

Код

class Program
    {
        const int ENUM_CURRENT_SETTINGS = -1;
        static void Main(string[] args)
        {
            foreach (Screen screen in Screen.AllScreens)
            {
                DEVMODE dm = new DEVMODE();
                dm.dmSize = (short)Marshal.SizeOf(typeof(DEVMODE));
                EnumDisplaySettings(screen.DeviceName, ENUM_CURRENT_SETTINGS, ref dm);
                Console.WriteLine($"Device: {screen.DeviceName}");
                Console.WriteLine($"Real Resolution: {dm.dmPelsWidth}x{dm.dmPelsHeight}");
                Console.WriteLine($"Virtual Resolution: {screen.Bounds.Width}x{screen.Bounds.Height}");
                Console.WriteLine();
            }
            Console.ReadKey();
        }

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

        [StructLayout(LayoutKind.Sequential)]
        public 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 ScreenOrientation 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;
        }
    }


Данный вариант тоже как рабочий, но при работе как служба аналогично возвращает некорректный результат.
При тестировании службу запускаю под админом.

Приветствую, Руслан 🖐
Правильно сделал, что перезадал вопрос тут. Скоро на канале будет видео с ответом, как нормально получать данные о железе.
Как грамотно получить монитор. То, что в инете нет, хотя все данные как бы есть.

Удаленный пользователь, Удаленный пользователь и ещё 3 отреагировали на эту запись.
Удаленный пользовательУдаленный пользовательУдаленный пользовательУдаленный пользовательУдаленный пользователь
Цитата: XpucT от 08.10.2021, 22:22

Приветствую, Руслан 🖐
Правильно сделал, что перезадал вопрос тут. Скоро на канале будет видео с ответом, как нормально получать данные о железе.
Как грамотно получить монитор. То, что в инете нет, хотя все данные как бы есть.

Спасибо огромное за отклик на вопрос, жду с нетерпением видео урок. 

Спасибо большое за урок.

using System.Management;


private void ScreenResolution()
        {
            UInt32 width = 0;
            UInt32 height = 0;
            foreach (var desktopMonitor in new ManagementObjectSearcher("ROOT\\CIMV2", "SELECT * FROM Win32_DesktopMonitor").Get())
            {
                width = (UInt32)desktopMonitor["ScreenWidth"];
                height = (UInt32)desktopMonitor["ScreenHeight"];
            }
            loger.Info($"Primary Current Screen Resolution: {Convert.ToString(width)} x {Convert.ToString(height)}");
        }

Задача решена.

09.10.2021 03:10:37    [INFO]    Primary Current Screen Resolution: 2560 x 1080
admin, Удаленный пользователь и ещё 2 отреагировали на эту запись.
adminУдаленный пользовательУдаленный пользовательУдаленный пользователь