Информация на экране, пока система Windows заблокирована (.NET) - PullRequest
0 голосов
/ 15 марта 2010

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

Проблема в том, что при запуске мы создаем панель приложений 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}

Ответы [ 3 ]

1 голос
/ 15 марта 2010

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

0 голосов
/ 06 августа 2010

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

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

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

0 голосов
/ 15 марта 2010

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...