Console Framework 4.5 Информация по монитору и его разрешение. [Решено]
Цитата: Удаленный пользователь от 07.10.2021, 13:56Доброго всем дня.
Прошу помощи.
Нужно реализовать получение разрешения монитора.Пробовал подход как пишут в 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. (((
Доброго всем дня.
Прошу помощи.
Нужно реализовать получение разрешения монитора.
Пробовал подход как пишут в 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Добрый день 🖐
Зачем запускаете через службу?
Добрый день 🖐
Зачем запускаете через службу?
Цитата: Удаленный пользователь от 07.10.2021, 14:38Цитата: Сергей от 07.10.2021, 14:28Добрый день
Зачем запускаете через службу?Задача стоит чтобы установить на все терминалы в сети агента (службу) который собирает некоторые данные, в том числе и разрешение экрана.
Агент результат сбора отправляет данные в мониторинг Zabbix.
Разрешение экрана это важный параметр который нужно отслеживать чтобы картинка которая транслируется на мониторе терминала соответствовала некоторым параметрам.
Цитата: Сергей от 07.10.2021, 14:28Добрый день
Зачем запускаете через службу?
Задача стоит чтобы установить на все терминалы в сети агента (службу) который собирает некоторые данные, в том числе и разрешение экрана.
Агент результат сбора отправляет данные в мониторинг Zabbix.
Разрешение экрана это важный параметр который нужно отслеживать чтобы картинка которая транслируется на мониторе терминала соответствовала некоторым параметрам.
Цитата: Удаленный пользователь от 07.10.2021, 14:49Добрый день.
АScreen.PrimaryScreen.Bounds.WidthиScreen.PrimaryScreen.Bounds.Heightчто возвращают? При быстром гуглении чаще всего такой вариант предлагается.
Добрый день.
А СкопированоScreen.PrimaryScreen.Bounds.Width и СкопированоScreen.PrimaryScreen.Bounds.Height что возвращают? При быстром гуглении чаще всего такой вариант предлагается.
Цитата: Удаленный пользователь от 07.10.2021, 15:18Цитата: 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
Цитата: 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
Цитата: Удаленный пользователь от 07.10.2021, 15:25При гуглении наткнулся еще на один такой вариант.
[spoiler title="Код"]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; } }[/spoiler]
Данный вариант тоже как рабочий, но при работе как служба аналогично возвращает некорректный результат.
При тестировании службу запускаю под админом.
При гуглении наткнулся еще на один такой вариант.
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;
}
}
Данный вариант тоже как рабочий, но при работе как служба аналогично возвращает некорректный результат.
При тестировании службу запускаю под админом.
Цитата: admin от 08.10.2021, 22:22Приветствую, Руслан 🖐
Правильно сделал, что перезадал вопрос тут. Скоро на канале будет видео с ответом, как нормально получать данные о железе.
Как грамотно получить монитор. То, что в инете нет, хотя все данные как бы есть.
Приветствую, Руслан 🖐
Правильно сделал, что перезадал вопрос тут. Скоро на канале будет видео с ответом, как нормально получать данные о железе.
Как грамотно получить монитор. То, что в инете нет, хотя все данные как бы есть.
Цитата: Удаленный пользователь от 08.10.2021, 22:40Цитата: XpucT от 08.10.2021, 22:22Приветствую, Руслан
Правильно сделал, что перезадал вопрос тут. Скоро на канале будет видео с ответом, как нормально получать данные о железе.
Как грамотно получить монитор. То, что в инете нет, хотя все данные как бы есть.Спасибо огромное за отклик на вопрос, жду с нетерпением видео урок.
Цитата: XpucT от 08.10.2021, 22:22Приветствую, Руслан
Правильно сделал, что перезадал вопрос тут. Скоро на канале будет видео с ответом, как нормально получать данные о железе.
Как грамотно получить монитор. То, что в инете нет, хотя все данные как бы есть.
Спасибо огромное за отклик на вопрос, жду с нетерпением видео урок.
Цитата: Удаленный пользователь от 09.10.2021, 03:11Спасибо большое за урок.
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
Спасибо большое за урок.
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