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

Winforms 当显示器禁用时(例如笔记本电脑盖关闭),在第二个显示器(屏幕)上保持/恢复窗口?,winforms,screen,multiple-monitors,Winforms,Screen,Multiple Monitors,我有一个Winform应用程序,它接收一个命令行参数,指定它是否会通过I-Omega USB双监视器连接器显示在第二个监视器的主监视器上 该应用程序在笔记本电脑上运行,并使用两个监视器。 1.第一个显示器只需连接到笔记本电脑的VGA端口。我运行“MyApplication.exe 1” 2.第二台显示器通过USB双显示器VGA端口连接。我运行第二个实例“MyApplication.exe 2” 通过使用Screen.AllScreens并更改表单的位置,我可以强制应用程序的第二个实例转到第二个月

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

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

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

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


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

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

我使用了上一个问题中的ShowOnMonitor方法:


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

我使用了上一个问题中的ShowOnMonitor方法:


不确定监视打开/关闭事件,但您可以尝试在窗体激活的事件处理程序中定位窗体。查看SystemEvents类。猜测DisplaySettingsChanged或UserPreferenceChanged事件。不确定监视器打开/关闭事件,但可以尝试在表单激活的事件处理程序中定位表单。查看SystemEvents类。猜测显示设置更改或用户首选项更改事件。
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();
    }
}