我有一个 C# Windows 应用程序,我想确保如果用户将它移到第二台显示器上,它会显示在第二台显示器上。我需要保存主窗体的大小、位置和窗口状态——我已经处理过了——但我还需要知道用户关闭应用程序时它在哪个屏幕上。
我正在使用 Screen 类来确定当前屏幕的大小,但我找不到任何关于如何确定应用程序在哪个屏幕上运行的信息。
编辑:谢谢大家的回复!我想确定窗口在哪个监视器上,这样我就可以进行适当的边界检查,以防用户不小心将窗口放在查看区域之外或更改了屏幕大小,从而使表单不再完全可见。
您可以使用此代码获得一组屏幕。
Screen[] screens = Screen.AllScreens;
您还可以通过运行此代码来确定您所在的屏幕(这是您所在的 Windows 窗体)
Screen screen = Screen.FromControl(this); //this is the Form class
简而言之,查看 Screen 类和静态辅助方法,它们可能会对您有所帮助。
MSDN Link,没有太多..我建议自己搞乱代码。
如果您记住窗口的位置和大小,就足够了。当您将位置设置为先前使用的位置时,如果它恰好在第二台显示器上,它将回到那里。
例如,如果您有 2 台显示器,尺寸均为 1280x1024,并且您将窗口的左侧位置设置为 2000 像素,它将出现在第二台显示器上(假设第二台显示器在第一台显示器的右侧。):)
如果您担心下次启动应用程序时第二个监视器不存在,您可以使用此方法来确定您的窗口是否与任何屏幕相交:
private bool isWindowVisible(Rectangle rect)
{
foreach (Screen screen in Screen.AllScreens)
{
if (screen.Bounds.IntersectsWith(rect))
return true;
}
return false;
}
只需传入您窗口的所需位置,它就会告诉您它是否会在其中一个屏幕上可见。享受!
您可以通过以下方式获取当前屏幕
var s = Screen.FromControl(this);
this
表单(或表单上的任何控件)在哪里。至于如何记住这有点棘手,但我会选择 Screen.AllScreens 数组中的索引,或者可能是 s.DeviceName。无论哪种情况,请在启动时使用设置之前进行检查,以防止使用已断开连接的显示器。
表格的位置会告诉您表格在哪个屏幕上。我真的不明白为什么您需要知道它在哪个屏幕上,因为如果您使用保存的位置恢复它,它应该只恢复到相同的位置(也许您可以扩展原因)。
否则,您可以执行以下操作:
Screen[] scr = Screen.AllScreens;
scr[i].Bounds.IntersectsWith(form.Bounds);
每个屏幕都有一个返回 Rectangle 的 Bounds 属性。您可以使用 IntersectsWith() 函数来确定表单是否在屏幕内。
此外,它们基本上提供了一个在 Screen 类上也能做到这一点的函数
Screen screen = Screen.FromControl(form);
您可以使用“屏幕”对象:System.Windows.Forms.Screen
开始玩这样的东西:
Screen[] screens = Screen.AllScreens;
for (int i = 0; i < screens.Length ; i++)
{
Debug.Print(screens[i].Bounds.ToString());
Debug.Print(screens[i].DeviceName);
Debug.Print(screens[i].WorkingArea.ToString());
}
它可能会为您提供所需的东西