Jak uzyskać rozdzielczość ekranu bez Windows Forms odniesienia?

głosy
1

Potrzebuję uzyskać rozdzielczość pulpitu moja próba biegnie dalej. Wcześniej byłem chwytając rozdzielczość takiego:

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

Niestety, przy użyciu System.Windows.Formsnie jest już możliwe. Mój projekt jest .NET Core więc najlepiej muszę pakiet Nuget do tego.

Jeśli ktoś ma jakieś sugestie będę wdzięczny.

Utwórz 18/12/2018 o 11:05
źródło użytkownik
W innych językach...                            


1 odpowiedzi

głosy
1

Jeśli nie chcesz korzystać System.Windows.Forms(lub nie mogą), można uzyskać rozdzielczość ekranu za pomocą funkcji Windows API EnumDisplaySettings.

Aby wywołać funkcję WinAPI, można użyć P / Invoke funkcji, które są dostępne również na .NET Core. Należy pamiętać, że to działa tylko w systemie Windows, ponieważ nie ma WinAPI na celach innych niż Windows.

Deklaracja funkcji wygląda następująco:

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

Musisz również WinAPI DEVMODEdefinicję 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;
}

Faktycznie, nie trzeba większości pól tej struktury jest. Ciekawe nich są dmPelsWidthi dmPelsHeight.

Wywołać funkcję tak:

const int ENUM_CURRENT_SETTINGS = -1;

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

Teraz można sprawdzić rozdzielczość ekranu w dmPelsWidthi dmPelsHeightpól devModestruktury.

Ponieważ określić nulljako pierwszy argument, funkcja opisuje obecną urządzenie wyświetlające na komputerze, na którym jest uruchomiony wątek wywołujący.

Odpowiedział 18/12/2018 o 16:06
źródło użytkownik

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