当显示屏禁用时(例如笔记本电脑盖关闭),在第二台显示器(屏幕)上保留/恢复窗口?

时间:2011-12-13 06:28:26

标签: winforms screen multiple-monitors

我有一个Winform应用程序,它接收一个命令行参数,指定它是否会通过I-Omega USB双显示器连接器显示在第二个显示器的主监视器上。

该应用程序在笔记本电脑上运行并使用两台显示器。 1.第一台显示器只连接到笔记本电脑的VGA端口。我运行“MyApplication.exe 1” 2.第二台显示器通过USB双显示器VGA端口连接。我运行第二个实例“MyApplication.exe 2”

我可以通过使用Screen.AllScreens并更改Form的位置来强制应用程序的第二个实例转到第二个montior。如果笔记本电脑折叠,我在笔记本电脑的电源设置中指定不要使用待机或关机显示器。当我关闭笔记本电脑的显示器时,应用程序的两个实例都保留在各自的显示器上。但是当我重新打开笔记本电脑时,第二个实例会移动第一个屏幕。

我的问题是在.NET中有一个监视器打开事件吗?或者是否有其他设置将第二个实例保留到第二个监视器/屏幕?

我知道有一个WM_POWERBROADCAST事件但是,我已经将笔记本电脑设置为不睡觉。

1 个答案:

答案 0 :(得分:1)

我能够通过Windows事件而不是使用计时器来做到这一点。基本上,计时器将检查具有所需屏幕的窗口的位置。如果它与所需的屏幕不匹配,我会再次调整位置以移动到所需的显示器。在检查左上角位置是否相等时,我添加了4(WinXP)~8(Win7)像素的容差。处于最大化状态时,顶部和左侧位置变为(-4,-4)。在最小化状态下,我不检查位置。

我使用了上一个问题中的ShowOnMonitor方法: How do I ensure a form displays on the "additional" monitor in a dual monitor scenario?

private void autoAdjustPositionTimer_Tick(object sender, EventArgs e) {

    if (WindowState == FormWindowState.Minimized)
    {
        return;
    }

    autoAdjustPositionTimer.Stop();
    try
    {
        Screen[] sc;
        sc = Screen.AllScreens;

        int showOnMonitor = ExpectedMonitorIndex; // i.e. 1
        if (showOnMonitor >= sc.Length)
        {
            showOnMonitor = 0;
        }

        int offsetTolerance = 8;

        // Check the top left position only
        int xDiff = Math.Abs(Location.X - sc[showOnMonitor].Bounds.Left);
        int yDiff = Math.Abs(Location.Y - sc[showOnMonitor].Bounds.Top);
        if (xDiff > offsetTolerance || yDiff > offsetTolerance){
            // Method to move the position
            ShowOnMonitor(showOnMonitor);
        }
    }
    finally
    {
        autoAdjustPositionTimer.Start();
    }
}