WPF中如何获取当前屏幕的大小?
我知道我可以通过使用获取主屏幕的大小,
System.Windows.SystemParameters.PrimaryScreenWidth;
System.Windows.SystemParameters.PrimaryScreenHeight;
但是如何获取当前屏幕的大小? (多屏幕用户并不总是使用主屏幕,并且并非所有屏幕都使用相同的分辨率,对吧?)如果
能够从 XAML 访问大小就好了,但从代码 (C#) 访问大小就足够了。
I know I can get the size of the primary screen by using
System.Windows.SystemParameters.PrimaryScreenWidth;
System.Windows.SystemParameters.PrimaryScreenHeight;
But how do I get the size of the current screen? (Multi-Screen users do not always use the primary screen and not all screens are using the same resolution, right?)
It would be nice to be able to acces the size from XAML, but doing so from code (C#) would suffice.
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(16)
我理解这些要求。
问题是,有一些 WPF 方法可以获取这些值 - 但是,是的,其中一位贡献者是正确的,但不是直接的。
解决方案不是获得所有这些解决方法,而是根据干净的设计和开发改变最初的方法。
A) 将初始主窗口设置为屏幕
B) 获取 ActualWindow 的值,包括大量有用的 WPF 方法
C) 您可以根据自己想要的行为添加任意数量的窗口,例如可调整大小、最小化等等……但是现在您始终可以访问已加载和渲染的屏幕
请小心以下示例,周围有一些代码使得有必要使用这种方法,但是它应该可以工作(它会给您每个角落的分数您的屏幕):
单显示器、双显示器和不同分辨率(在原始主窗口类内)的工作示例:
路由事件:
I understand the demands.
The thing is, there are WPF Methods for getting those values - but yes, one of the contributors is right, not directly.
The Solution is not to get all those workarounds, but to change the initial approach according to clean Design and Development.
A) Set the initial Main Window to Screen
B) Get the Values for the ActualWindow including a ton of useful WPF Methods
C) You can add as many Windows as you like for the behaviour you want to have, like resizeable, minimized whatever… but now you always can access the Loaded and Rendered Screen
Please be careful with the following example, there is some Code around that makes it necessary to use that kind of approach, however it should work (It would give you the Points for each of the Corners of your Screen):
Working Example on Single, Dual Monitor and different Resolutions (Within the Primal Main Window Class):
Routed Event:
如果您使用任何全屏窗口(其
WindowState = WindowState.Maximized、WindowStyle = WindowStyle.None
),则可以将其内容包装在System.Windows.Controls.Canvas
中像这样:然后您可以使用 MyCanvas.ActualWidth 和 MyCanvas.ActualHeight 来获取当前屏幕的分辨率,并考虑 DPI 设置并采用与设备无关的单位。
它不会像最大化窗口本身那样添加任何边距。
(Canvas 接受
UIElement
作为子元素,因此您应该能够将它与任何内容一起使用。)If you use any full screen window (having its
WindowState = WindowState.Maximized, WindowStyle = WindowStyle.None
), you can wrap its contents inSystem.Windows.Controls.Canvas
like this:Then you can use
MyCanvas.ActualWidth
andMyCanvas.ActualHeight
to get the resolution of the current screen, with DPI settings taken into account and in device independent units.It doesn't add any margins as the maximized window itself does.
(Canvas accepts
UIElement
s as children, so you should be able to use it with any content.)对于WPF应用程序(.NET框架):
您可以声明一个Window事件,名为:SizeChanged(从客户端跟踪屏幕尺寸变化)
这样你就可以在运行时获取屏幕的大小。
For WPF App(.NET framework) :
You can declare a Window event called: SizeChanged (tracking the screen size change from the client side)
This way you can get the size of the screen at runtime.
在 XAML 中将窗口置于屏幕中央
WindowStartupLocation="CenterOwner"
,然后调用 WindowLoaded()double ScreenHeight = 2 * (Top + 0.5 * Height);
Center Window on the screen in XAML
WindowStartupLocation="CenterOwner"
then call in WindowLoaded()double ScreenHeight = 2 * (Top + 0.5 * Height);
它可
在 2 台显示器上进行测试。
It works with
Tested on 2 monitors.
我从 System.Windows.Forms 创建了一个围绕屏幕的小包装,目前一切正常......
但不确定“设备独立像素”。
I created a little wrapper around the Screen from System.Windows.Forms, currently everything works...
Not sure about the "device independent pixels", though.
我还需要当前的屏幕尺寸,特别是工作区域,它返回不包括任务栏宽度的矩形。
我用它来重新定位窗口,该窗口向右和向下打开到鼠标所在的位置。由于窗口相当大,在许多情况下它超出了屏幕范围。以下代码基于 @ej 答案:这将为您提供当前屏幕...。不同之处在于,我还展示了我的重新定位算法,我认为这实际上是重点。
代码:
一些解释:
就会丢失)。
...
I also needed the current screen dimension, specifically the Work-area, which returned the rectangle excluding the Taskbar width.
I used it in order to reposition a window, which is opened to the right and down to where the mouse is positioned. Since the window is fairly large, in many cases it got out of the screen bounds. The following code is based on @e-j answer: This will give you the current screen.... The difference is that I also show my repositioning algorithm, which I assume is actually the point.
The code:
Some explanations:
would have been lost).
<remark><code>...</code></remark>
在这里,伙计。这只会给你工作区的宽度和高度
Here budy. This will give you only the width and height of the workarea
这将为您提供基于窗口左上角的当前屏幕,只需调用 this.CurrentScreen() 即可获取当前屏幕上的信息。
This will give you the current screen based on the top left of the window just call this.CurrentScreen() to get info on the current screen.
据我所知,没有原生 WPF 方法可以获取给定监视器的尺寸。相反,您可以 PInvoke 本机 多显示器功能,将它们包装在托管类中(或使用微软官方的 CsWin32 Nuget 包)并公开您需要从 XAML 使用的所有属性。
As far as I know, there is no native WPF method(s) to get the dimensions of a given monitor. Instead, you could PInvoke native Multiple Display Monitors Functions, wrap them in a managed class (or use Microsoft's official CsWin32 Nuget package) and expose all properties you need to consume from XAML.
我很欣赏这是一个老问题,但由于 WPF 仍然没有提供一种“开箱即用”的好方法,并且上面的答案似乎有点过于复杂,希望您会发现下面的解决方案更容易一些消化..
享受 :)
I appreciate this is an old question, but seeing as WPF still doesn't provide a nice way to do this 'out of the box' and the above answers seem a little overly complicated, hopefully you'll find the solution below a bit easier to digest..
Enjoy :)
为什么不直接使用这个呢?
Why not just use this?
我看到这篇文章,发现没有一个答案完全体现了我想要做的事情。我有一台分辨率为 3840x2160 的笔记本电脑和两台分辨率为 1920x1080 的显示器。为了在我的 WPF 应用程序中获得正确的显示器大小,我必须 制作应用程序DPI 感知。然后我使用 Win32 API 来获取监视器大小。
我通过首先将窗口移动到我想要从中获取尺寸的监视器来做到这一点。然后通过获取应用程序 MainWindow 的 hwnd(不一定是主窗口,但我的应用程序只有一个窗口)和监视器的 IntPtr 。然后我创建了 MONITORINFOEX 结构的一个新实例并调用 GetMonitorInfo 方法。
MONITORINFOEX 结构体具有工作区域和屏幕的全分辨率,因此您可以返回您需要的任何一个。这还允许您省略对 System.Windows.Forms 的引用(假设您的应用程序中不需要它)。我使用了 .NET Framework 参考System.Windows.Forms.Screen 的来源 提出了此解决方案。
I came across this post and found that none of the answers fully captured what I was trying to do. I have a laptop that has a 3840x2160 resolution and two monitors with 1920x1080 resolution. In order to get the correct monitor size in my WPF application I had to make the application DPI aware. Then I used the Win32 API to get the monitor size.
I did this by first moving the window to the monitor that I wanted to get the size from. Then by getting the hwnd of the application's MainWindow (doesn't have to be the main window but my application only has one window) and an IntPtr to the monitor. Then I created a new instance of the MONITORINFOEX struct and called the GetMonitorInfo method.
The MONITORINFOEX struct has both the working area and the full resolution of the screen so you can return whichever one you need. This will also allow you to leave out a reference to System.Windows.Forms (assuming you don't need it something else in your application). I used the .NET Framework Reference Source for System.Windows.Forms.Screen to come up with this solution.
花点时间浏览一下 SystemParameters 成员。
VirtualScreenWidth
VirtualScreenHeight
这些甚至考虑了屏幕的相对位置。
仅使用两台显示器进行测试。
Take the time to scan through the SystemParameters members.
VirtualScreenWidth
VirtualScreenHeight
These even take into account the relative positions of the screens.
Only tested with two monitors.
如果您熟悉使用 System.Windows.Forms 类,那么您只需添加 System.Windows.Forms 类的引用到您的项目中即可:
解决方案资源管理器< /strong>-> 参考文献 -> 添加参考文献... -> (程序集:框架) ->向下滚动并检查 System.Windows.Forms 程序集 -> 好的。
现在,您可以像以前一样在 wpf 项目中添加 using System.Windows.Forms; 语句并使用 screen。
If you are familiar with using System.Windows.Forms class then you can just add a reference of System.Windows.Forms class to your project:
Solution Explorer -> References -> Add References... -> ( Assemblies : Framework ) -> scroll down and check System.Windows.Forms assembly -> OK.
Now you can add using System.Windows.Forms; statement and use screen in your wpf project just like before.