Одна вещь, о которой необходимо знать при использовании 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
запускается, где первый, брошенный, и, останавливается, когда он достигает конца хеша, таким образом, мы никогда не видим их во втором цикле.
В качестве альтернативы захвату экрана (который я также использовал в прошлом как подход при немного иных обстоятельствах) вы также можете сделать это, создав новое окно (WinForm), которое находится в полноэкранном режиме поверх всех остальных окон.
Если вы установите цвет фона окна на сплошной черный, а затем установите непрозрачность на 70-80%, вы получите что-то похожее на приглашение UAC.
например,
formName.WindowState = FormWindowState.Maximized;
formName.FormBorderStyle = FormBorderStyle.None;
formName.Opacity = 0.70;
formName.TopMost = true;
Конечно, было бы разумно нарисовать сверху окно, информирующее пользователя о том, почему экран затемнен, с помощью счетчика.
Использование чего-то, что достаточно похоже на приглашение UAC (что люди привыкли видеть), чтобы люди даже дважды не думали об этом, в зависимости от варианта использования может быть достаточно.
Как и в случае с захватом экрана, это на нем '
Эээ, неправильно прочитал ваш вопрос. Диалог UAC в Vista создает новый рабочий стол и показывает себя на нем. Для создания рабочего стола вы можете использовать функцию CreateDesktop . Затем вы можете использовать SwitchDesktop , чтобы переключиться на него.
Если вы действительно хотите воссоздать внешний вид защищенного рабочего стола, вам нужно сначала сделать снимок экрана и отобразить его в форме, немного затемненным .
Исходный ответ ниже, который тоже может быть интересен:
Взгляните на функцию LockWorkStation .
Однако вы не можете программно разблокировать снова рабочая станция. Это то, что пользователь должен делать сам. Так что вы можете' t легко сделать перерыв продолжительностью не менее двух минут, если вы все еще не прибегаете к технике окон верхнего уровня, чтобы запретить пользователю его рабочее пространство, пока две минуты еще не истекли.