2010-03-08 128 views

回答

58

您是否需要標準應用程序所使用的區域,即排除Windows任務欄和停靠窗口?如果是這樣,請使用Screen.WorkingArea property。否則,請使用Screen.Bounds

如果有多個顯示器,則需要從形式抓取屏幕,即

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

如果你想知道哪個是主顯示屏幕,使用Screen.Primary屬性。此外,您可以從Screen.AllScreens屬性中獲取屏幕列表。

+2

+1。我錯誤地使用了Screen.Bounds。如果可以的話,我會給你+2,提及Screen.FromControl而不是Screen.PrimaryScreen! – ToolmakerSteve 2013-10-10 17:44:51

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

給出的答案是正確的,就它而言。但是,如果將文本大小設置爲超過125%,Windows(和.NET)會開始掃描屏幕大小以便自動縮放。

大多數情況下,這不是問題 - 您通常希望Windows和.NET來執行此操作。但是,如果真的需要知道屏幕上像素的實際數量(例如,要直接繪製到桌面DC),則可以執行以下操作。我只在Win10上試過這個。 YMMV在其他Windows版本上。

到目前爲止,如果您不想全局關閉應用程序中的DPI感知功能,那麼這是獲得真正屏幕像素數的唯一方法。請注意,此示例獲取主顯示屏大小 - 您需要修改此屏幕以獲取其他屏幕。

[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);