Самый верный способ узнать разрешение экрана - обратиться к функции GetDeviceCaps из интерфейса GDI, проблема только в том, что этот интерфейс реализован в Си и не поддерживается в штатной поставке Compact Framework.
К этому интерфейсу можно добраться через механизм, который в .NET назвали Platform Invoke. В С# надо объявить несколько методов специального вида, вызовы которых во время исполнения программы будут перенаправляться в реализацию интерфейса на Си.
Вот пример, который делает обёртку вокруг нескольких низкоуровневых функций из GDI.
using System;
using System.Runtime.InteropServices;
class GDIHelper
{
[DllImport("coredll.dll", SetLastError = false)]
public static extern IntPtr GetDC(IntPtr hWnd);
[DllImport("coredll.dll", SetLastError = false)]
public static extern int ReleaseDC(IntPtr hWnd, IntPtr hdc);
[DllImport("coredll.dll", SetLastError = false)]
public static extern int GetDeviceCaps(IntPtr hdc, int nIndex);
public static int GetDeviceCaps(int nIndex)
{
IntPtr hDC = GetDC(NULL);
int result = GetDeviceCaps(hDC, nIndex);
ReleaseDC(NULL, hDC);
return result;
}
public static IntPtr NULL = new IntPtr(0);
// Константы для GetDeviceCaps
public const int DRIVERVERSION = 0; /* Device driver version */
public const int TECHNOLOGY = 2; /* Device classification */
public const int HORZSIZE = 4; /* Horizontal size in millimeters */
public const int VERTSIZE = 6; /* Vertical size in millimeters */
public const int HORZRES = 8; /* Horizontal width in pixels */
public const int VERTRES = 10; /* Vertical height in pixels */
public const int BITSPIXEL = 12; /* Number of bits per pixel */
public const int PLANES = 14; /* Number of planes */
public const int NUMBRUSHES = 16; /* Number of brushes the device has */
public const int NUMPENS = 18; /* Number of pens the device has */
public const int NUMMARKERS = 20; /* Number of markers the device has */
public const int NUMFONTS = 22; /* Number of fonts the device has */
public const int NUMCOLORS = 24; /* Number of colors the device supports */
public const int PDEVICESIZE = 26; /* Size required for device descriptor */
public const int CURVECAPS = 28; /* Curve capabilities */
public const int LINECAPS = 30; /* Line capabilities */
public const int POLYGONALCAPS = 32; /* Polygonal capabilities */
public const int TEXTCAPS = 34; /* Text capabilities */
public const int CLIPCAPS = 36; /* Clipping capabilities */
public const int RASTERCAPS = 38; /* Bitblt capabilities */
public const int ASPECTX = 40; /* Length of the X leg */
public const int ASPECTY = 42; /* Length of the Y leg */
public const int ASPECTXY = 44; /* Length of the hypotenuse */
}
Константы взяты из заголовочного файла wingdi.h
После добавления класса GDIHelper в свой проект вместо обращений к свойствам PrimaryMonitorSize надо делать вызовы GDIHelper.GetDeviceCaps(HORZRES) и GDIHelper.GetDeviceCaps(VERTRES):
label1.Text = GDIHelper.GetDeviceCaps(GDIHelper.HORZRES)
+ " x " +
GDIHelper.GetDeviceCaps(GDIHelper.VERTRES)