Como obter a resolução da tela sem referência Windows Forms?

votos
1

Eu preciso para obter a resolução da área de trabalho do meu teste é executado. Anteriormente eu estava agarrando a resolução como esta:

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

Infelizmente, usando System.Windows.Formsnão é mais possível. Meu projeto é .NET Core, de modo preferência Eu preciso de um pacote NuGet para isso.

Se alguém tem alguma sugestão que eu aprecio isso.

Publicado 18/12/2018 em 11:05
fonte usuário
Em outras línguas...                            


1 respostas

votos
1

Se você não quiser usar System.Windows.Forms(ou não pode), você pode obter a resolução da tela usando uma função de API do Windows EnumDisplaySettings.

Para chamar a função WinAPI, você pode usar o P / característica que também está disponível no .NET Núcleo invocar. Por favor note que isto só irá funcionar em um sistema Windows, porque não há WinAPI em alvos não-Windows.

A declaração da função é o seguinte:

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

Você também precisa da WinAPI DEVMODEdefinição 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;
}

Na verdade, você não precisa mais de campos desta estrutura. Os interessantes são dmPelsWidthe dmPelsHeight.

Chamar a função como esta:

const int ENUM_CURRENT_SETTINGS = -1;

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

Agora você pode verificar a resolução da tela nos dmPelsWidthe dmPelsHeightcampos da devModestruct.

Desde que especifique nullcomo primeiro argumento, a função descreve o dispositivo de exibição atual no computador em que o segmento de chamada está sendo executado.

Respondeu 18/12/2018 em 16:06
fonte usuário

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