Cum să obțineți rezoluția ecranului, fără a Windows Forms de referință?

voturi
1

Am nevoie pentru a obține rezoluția desktop testul meu rulează pe. Anterior, am fost hapsân rezoluția ca aceasta:

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

Din păcate, folosind System.Windows.Formsnu mai este posibil. Proiectul meu este NET Core, deci , de preferință , am nevoie de un pachet de NuGet pentru acest lucru.

Dacă cineva are orice sugestii aș aprecia.

Întrebat 18/12/2018 la 11:05
sursa de către utilizator
În alte limbi...                            


1 răspunsuri

voturi
1

Dacă nu doriți să utilizați System.Windows.Forms(sau poate nu), puteți obține rezoluția ecranului utilizând o funcție API pentru Windows EnumDisplaySettings.

Pentru a apela funcția WinAPI, puteți utiliza P / Invoca caracteristică care este de asemenea disponibil pe .NET Core. Vă rugăm să rețineți că acest lucru va funcționa numai pe un sistem Windows, pentru că nu există WinAPI pe obiective non-Windows.

Declarația Funcția arată după cum urmează:

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

Ai nevoie , de asemenea, WinAPI DEVMODEdefiniția 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;
}

De fapt, nu aveți nevoie de cele mai multe domenii de această structură a lui. Cele interesante sunt dmPelsWidthși dmPelsHeight.

Apelați funcția astfel:

const int ENUM_CURRENT_SETTINGS = -1;

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

Acum puteți verifica rezoluția ecranului în dmPelsWidthși dmPelsHeightcâmpurile devModestruct.

Din moment ce precizam nullca prim argument, funcția descrie dispozitivul de afișare curentă pe computerul pe care firul de asteptare se execută.

Publicat 18/12/2018 la 16:06
sursa de către utilizator

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