2010-03-08 14 views

Odpowiedz

58

Potrzebujesz tylko obszaru używanego przez standardową aplikację, tj. Z wyłączeniem paska zadań systemu Windows i zadokowanych okien? Jeśli tak, użyj Screen.WorkingArea property. W przeciwnym razie użyj Screen.Bounds.

Jeśli istnieje wiele monitorów, trzeba chwycić ekran z formularza, tj

Form myForm; 
Screen myScreen = Screen.FromControl(myForm); 
Rectangle area = myScreen.WorkingArea; 

Jeśli chcesz wiedzieć, co jest ekran podstawowy, należy użyć właściwości Screen.Primary. Możesz również uzyskać listę ekranów z właściwości Screen.AllScreens.

+2

+1 dla Screen.WorkingArea. Przez pomyłkę korzystałem z Screen.Bounds. Dałbym ci +2, gdybym mógł, za wzmiankę o Screen.FromControl zamiast Screen.PrimaryScreen! – ToolmakerSteve

-1
Screen.PrimaryScreen.WorkingArea.Size() 
5

Podana odpowiedź jest poprawna, tak dalece jak to idzie. Jednak po ustawieniu rozmiaru tekstu na wartość większą niż 125%, system Windows (i .NET) zacznie kręcić o rozmiar ekranu, aby wykonać automatyczne skalowanie.

W większości przypadków nie jest to problemem - zazwyczaj chcesz, aby to zrobił system Windows i .NET. Jednak w przypadku, gdy naprawdę potrzebujesz znać rzeczywistą liczbę pikseli na ekranie (powiedzmy, że chcesz malować bezpośrednio na DC komputera), możesz wykonać następujące czynności. Próbowałem tego tylko na Win10. YMMV w innych wersjach systemu Windows.

Do tej pory jest to jedyny sposób, w jaki udało mi się uzyskać rzeczywistą liczbę pikseli na ekranie, jeśli nie chcesz całkowicie wyłączać świadomości DPI w swojej aplikacji. Zwróć uwagę, że ten przykład pobiera główny rozmiar ekranu - musisz go zmodyfikować, aby uzyskać inne ekrany.

[DllImport("User32.dll")] 
static extern IntPtr GetDC(IntPtr hwnd); 

[DllImport("User32.dll")] 
static extern int ReleaseDC(IntPtr hwnd, IntPtr dc); 

[DllImport("gdi32.dll")] 
static extern int GetDeviceCaps(IntPtr hdc, int nIndex); 

IntPtr primary = GetDC(IntPtr.Zero); 
int DESKTOPVERTRES = 117; 
int DESKTOPHORZRES = 118; 
int actualPixelsX = GetDeviceCaps(primary, DESKTOPHORZRES); 
int actualPixelsY = GetDeviceCaps(primary, DESKTOPVERTRES); 
ReleaseDC(IntPtr.Zero, primary); 
Powiązane problemy