Сохранить / восстановить окно на втором мониторе (экране), когда дисплей отключен (например, крышка ноутбука закрыта)? - PullRequest
1 голос
/ 13 декабря 2011

У меня есть приложение Winform, которое получает параметр командной строки, который указывает, будет ли он отображаться на главном мониторе второго монитора через разъем двойного монитора I-Omega USB.

Приложение работает наноутбук и использует два монитора.1. Первый монитор просто подключить к порту VGA ноутбука.Я запускаю «MyApplication.exe 1» 2. Второй монитор подключен через USB-порт VGA с двумя мониторами.Я запускаю второй экземпляр «MyApplication.exe 2»

. Мне удалось заставить второй экземпляр приложения перейти ко второму монитору, используя Screen.AllScreens и изменив местоположение формы.Я указал в настройках питания ноутбука, чтобы он не переключался в режим ожидания или выключения монитора, если ноутбук сложен.Когда я закрываю монитор ноутбука, оба экземпляра приложения остаются на соответствующем мониторе.Но когда я снова открываю ноутбук, второй экземпляр перемещает первый экран.

У меня вопрос, есть ли событие открытия монитора в .NET?Или есть другие настройки для сохранения второго экземпляра для второго монитора / экрана?

Я знаю, что есть событие WM_POWERBROADCAST, но я уже установил ноутбук, чтобы он не спал.

1 Ответ

1 голос
/ 15 декабря 2011

Мне удалось сделать это не по событию Windows, а по таймеру.По сути, таймер будет проверять местоположение окна с нужным экраном.Если он не соответствует желаемому экрану, я бы снова настроил местоположение, чтобы перейти к нужному монитору.Я добавил допуск 4 (WinXP) ~ 8 (Win7) пикселей при проверке, совпадает ли верхнее левое местоположение.Верхнее и левое расположение становится (-4, -4) в развернутом состоянии.В свернутом состоянии я не проверяю местоположение.

Я использовал метод ShowOnMonitor из предыдущего вопроса: Как обеспечить отображение формы на «дополнительном» мониторе в сценарии с двумя мониторами?

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();
    }
}
...