2010-03-08 77 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);