Comment obtenir la résolution d'écran sans référence Windows Forms?

voix
1

Je dois obtenir la résolution du bureau de mon test est exécuté. Auparavant, j'attrapait la résolution comme ceci:

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

Malheureusement, l' utilisation System.Windows.Formsest plus possible. Mon projet est de base .NET, donc de préférence je besoin d' un paquet NuGet pour cela.

Si quelqu'un a eu des suggestions que je vous en serais reconnaissant.

Créé 18/12/2018 à 11:05
source utilisateur
Dans d'autres langues...                            


1 réponses

voix
1

Si vous ne souhaitez pas utiliser System.Windows.Forms(ou non), vous pouvez obtenir la résolution d'écran en utilisant une fonction de l' API Windows EnumDisplaySettings.

Pour appeler la fonction WinAPI, vous pouvez utiliser la fonction P / Invoke qui est également disponible sur le Core .NET. S'il vous plaît noter que cela ne fonctionnera que sur un système Windows, car il n'y a pas WinAPI sur des cibles non-Windows.

La déclaration de fonction se présente comme suit:

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

Vous devez également la WinAPI DEVMODEdéfinition 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 fait, vous n'avez pas besoin la plupart des champs de cette structure. Sont celles qui vous intéressent dmPelsWidthet dmPelsHeight.

Appelez la fonction comme ceci:

const int ENUM_CURRENT_SETTINGS = -1;

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

Maintenant , vous pouvez vérifier la résolution de l' écran dans les dmPelsWidthet les dmPelsHeightchamps de la devModestruct.

Étant donné que nous précisons nullque le premier argument, la fonction décrit le dispositif d'affichage en cours sur l'ordinateur sur lequel le thread appelant est en cours d' exécution.

Créé 18/12/2018 à 16:06
source utilisateur

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