¿Cómo obtener la resolución de la pantalla sin Windows Forms referencia?

votos
1

Necesito conseguir la resolución del escritorio de mi prueba se ejecuta en. Anteriormente yo estaba agarrando la resolución de la siguiente manera:

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

Desafortunadamente, el uso System.Windows.Formsya no es posible. Mi proyecto es .NET Core, por lo que necesito preferentemente un paquete NuGet para esto.

Si alguien tiene alguna sugerencia se lo agradecería.

Publicado el 18/12/2018 a las 11:05
fuente por usuario
En otros idiomas...                            


1 respuestas

votos
1

Si no desea utilizar System.Windows.Forms(o no pueden), se puede obtener la resolución de la pantalla mediante el uso de una función API de Windows EnumDisplaySettings.

Para llamar a la función API de Windows, puede utilizar los P / característica que también está disponible en .NET Core invocar. Tenga en cuenta que esto sólo funcionará en un sistema Windows, porque no hay WinAPI en objetivos que no sean Windows.

La declaración de la función es el siguiente:

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

También necesita la API de Windows DEVMODEdefinición struct:

[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;
}

En realidad, no es necesario la mayoría de los campos de esta estructura. Los interesantes son dmPelsWidthy dmPelsHeight.

Llame a la función como esta:

const int ENUM_CURRENT_SETTINGS = -1;

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

Ahora se puede comprobar la resolución de la pantalla en las dmPelsWidthy dmPelsHeightlos campos de la devModeestructura.

Dado que especificamos nullcomo primer argumento, la función describe el dispositivo de visualización actual en el equipo donde se ejecuta el subproceso de llamada.

Respondida el 18/12/2018 a las 16:06
fuente por usuario

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more