Информация на экране, когда система Windows заблокирована (.NET)

StackOverflow https://stackoverflow.com/questions/2447870

  •  20-09-2019
  •  | 
  •  

Вопрос

У нас есть ночной процесс обновления приложений на компьютере пользователя, который требует выключения и повторного запуска приложения (не пытаясь изменить этот процесс).

Проблема в том, что мы создаем панель приложений Windows при запуске, для которой требуется действительный экран, а когда система заблокирована, в классе Screen ее нет.Таким образом, ни один из визуальных эффектов не включен, и это выглядит очень некрасиво.

Единственный способ обойти это на данный момент — обнаружить заблокированный экран, просто повернуть его и подождать, пока пользователь не разблокирует рабочий стол, а затем продолжить запуск.Оставлять его выключенным — не вариант, поскольку это ключевая часть рабочего процесса наших пользователей, и они ожидают, что он будет запущен и заработает, если они оставили его таким же накануне вечером.

Есть идеи??Кажется, я нигде не могу найти информацию об отображении, но ее нужно где-то сохранить, поскольку пользователь все еще вошел в систему.

Содержимое массива Screen.AllScreens:

** При блокировке:

Device Name    : DISPLAY
Primary        : True
Bits Per Pixel : 0
Bounds         : {X=-1280,Y=0,Width=2560,Height=1024}
Working Area   : {X=0,Y=0,Width=1280,Height=1024}

** При разблокировке:

Device Name    : \\.\DISPLAY1
Primary        : True
Bits Per Pixel : 32
Bounds         : {X=0,Y=0,Width=1280,Height=1024}
Working Area   : {X=0,Y=0,Width=1280,Height=994}

Device Name    : \\.\DISPLAY2
Primary        : False
Bits Per Pixel : 32
Bounds         : {X=-1280,Y=0,Width=1280,Height=1024}
Working Area   : {X=-1280,Y=0,Width=1280,Height=964}
Это было полезно?

Решение

Для этой проблемы не существует четкого решения: Windows не предоставляет возможности определить, что рабочая станция заблокирована и активен «неправильный» рабочий стол.Вы можете обнаружить только переключение сеанса, пример кода здесь.Чтобы это работало, вам в значительной степени приходится включать этот код в приложение и оставлять в нем навигационную цепочку, которую оно могло бы прочитать при запуске резервного копирования.Обязательно сбросьте его после того, как вы использовали его один раз, чтобы приложение не могло зависнуть навсегда.

Другие советы

Эта проблема с блокировкой экрана зависит от того, какую версию вы используете: либо XP, которая использует GINA, которая блокирует экран, либо Vista, которая использует ContentProvider, оба эти механизма в конечном итоге несут ответственность за это.

Единственный способ узнать, заблокирован ли экран, — это включить заставку (это можно легко запросить, запустив pinvoke для запроса СистемыПараметрыИнформация, чтобы узнать, активна Заставка или нет - SPI_GETSCREENSAVERRUNNING и SPI_GETSCREENSAVESECURE чтобы определить, вызовет ли это GINA или Content Provider) при нажатии WinKey + L для запуска заставки, по истечении указанного периода времени, если нет активности, запускается GINA или ContentProvider и заменяет заставку экраном блокировки. ..Я включил две соответствующие ссылки, которые были опубликованы здесь, о безопасной информации о журналировании в Windows...

Это потребует небольшой работы, однако вы можете использовать EnumDisplayDevices, EnumDisplaySettingsEx, MonitorFromPoint, GetMonitorInfo из user32 и сделать снимок экрана устройства.

Если компьютер заблокирован или включена активная заставка, снимок экрана всегда имеет бежевый цвет.Вы можете проверить это условие, чтобы знать, что система заблокирована.Это также работает в системах, в которые используется RDP (например, тонкий клиент для XP VDI).

По крайней мере, это работает в моей среде.Примеры кода можно найти в Google.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top