Как я могу заблокировать экран с помощью C#?

Одна вещь, о которой необходимо знать при использовании each , состоит в том, что это имеет побочный эффект добавляющего "состояния" к хешу (хеш должен помнить то, что "следующий" ключ). Когда использование кода как отрывки отправило выше, которые выполняют итерации по целому хешу сразу, это обычно - не проблема. Однако Вы столкнетесь трудно для разыскивания проблем (я говорю на основе опыта;), при использовании each вместе с операторами как last или return для выхода от while ... each цикл перед обработкой всех ключей.

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

Пример:

my %hash = ( foo => 1, bar => 2, baz => 3, quux => 4 );

# find key 'baz'
while ( my ($k, $v) = each %hash ) {
    print "found key $k\n";
    last if $k eq 'baz'; # found it!
}

# later ...

print "the hash contains:\n";

# iterate over all keys:
while ( my ($k, $v) = each %hash ) {
    print "$k => $v\n";
}

Это печатает:

found key bar
found key baz
the hash contains:
quux => 4
foo => 1

, Что произошло с ключами "панель" и baz"? Они все еще там, но второе each запускается, где первый, брошенный, и, останавливается, когда он достигает конца хеша, таким образом, мы никогда не видим их во втором цикле.

6
задан dole doug 19 October 2009 в 13:17
поделиться

2 ответа

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

Если вы установите цвет фона окна на сплошной черный, а затем установите непрозрачность на 70-80%, вы получите что-то похожее на приглашение UAC.

например,

formName.WindowState = FormWindowState.Maximized; 
formName.FormBorderStyle = FormBorderStyle.None; 
formName.Opacity = 0.70; 
formName.TopMost = true;

Конечно, было бы разумно нарисовать сверху окно, информирующее пользователя о том, почему экран затемнен, с помощью счетчика.

Использование чего-то, что достаточно похоже на приглашение UAC (что люди привыкли видеть), чтобы люди даже дважды не думали об этом, в зависимости от варианта использования может быть достаточно.

Как и в случае с захватом экрана, это на нем '

5
ответ дан 8 December 2019 в 18:38
поделиться

Эээ, неправильно прочитал ваш вопрос. Диалог UAC в Vista создает новый рабочий стол и показывает себя на нем. Для создания рабочего стола вы можете использовать функцию CreateDesktop . Затем вы можете использовать SwitchDesktop , чтобы переключиться на него.

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


Исходный ответ ниже, который тоже может быть интересен:

Взгляните на функцию LockWorkStation .

Однако вы не можете программно разблокировать снова рабочая станция. Это то, что пользователь должен делать сам. Так что вы можете' t легко сделать перерыв продолжительностью не менее двух минут, если вы все еще не прибегаете к технике окон верхнего уровня, чтобы запретить пользователю его рабочее пространство, пока две минуты еще не истекли.

8
ответ дан 8 December 2019 в 18:38
поделиться
Другие вопросы по тегам:

Похожие вопросы: