Как получить разрешение экрана без справки Windows Forms? - PullRequest
0 голосов
/ 18 декабря 2018

Мне нужно получить разрешение рабочего стола, на котором выполняется мой тест.Ранее я получал разрешение следующим образом:

Screen screen = Screen.PrimaryScreen;
int screenWidth = screen.Bounds.Width;
int screenHeight = screen.Bounds.Height;

К сожалению, использование System.Windows.Forms больше невозможно.Мой проект - .NET Core, поэтому для этого мне нужен пакет NuGet.

Если у кого-нибудь есть какие-либо предложения, я буду признателен.

1 Ответ

0 голосов
/ 18 декабря 2018

Если вы не хотите использовать System.Windows.Forms (или не можете), вы можете получить разрешение экрана, используя функцию Windows API EnumDisplaySettings.

Для вызоваФункция WinAPI, вы можете использовать функцию P / Invoke, которая также доступна в .NET Core.Обратите внимание, что это будет работать только в системе Windows, поскольку WinAPI не используется для целей, отличных от Windows.

Объявление функции выглядит следующим образом:

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

Вам также нужен WinAPI DEVMODE определение структуры:

[StructLayout(LayoutKind.Sequential)]
struct DEVMODE
{
  [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 int 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;
}

На самом деле, вам не нужно большинство полей этой структуры.Интересными являются dmPelsWidth и dmPelsHeight.

. Вызовите функцию следующим образом:

const int ENUM_CURRENT_SETTINGS = -1;

DEVMODE devMode = default;
devMode.dmSize = (short)Marshal.SizeOf(devMode);
EnumDisplaySettings(null, ENUM_CURRENT_SETTINGS, ref devMode);

Теперь вы можете проверить разрешение экрана в полях dmPelsWidth и dmPelsHeight.devMode struct.

Так как мы указываем null в качестве первого аргумента, функция описывает текущее устройство отображения на компьютере, на котором работает вызывающий поток.

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