Как я могу предотвратить принудительную блокировку экрана в Windows 7?

96

Наш корпоративный BOFH вводит настройку блокировки экрана с смехотворно короткой задержкой. Это расстраивает и контрпродуктивно.

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

Просто спрашиваю, прежде чем я установлю вечное колесо мыши. (возьми?)

Габриэль Р.
источник
1
Просто любопытно, что такое "смехотворно короткий"?
Карл
Там являются обходные пути , такие как ключевые прижимных и движителей мыши , которые будут препятствовать экран от блокировки. Но вы уверены, что хотите это сделать? Обход ИТ-безопасности более чем вероятен вопреки политике компании и может быть подделан.
Келтари
7
15 минут. Хорошо, это не так уж и мало ... если вы не дома, не на открытом пространстве, а также часто работаете на втором компьютере. Как и я, поэтому блокировка экрана противна.
Габриэль Р.
Один из обходных путей состоит не в том, чтобы заблокировать заставку, а в том, чтобы установить льготный период на несколько часов. (Это время между запуском экранной заставки и временем, необходимым для ввода пароля. Обычно это значение равно 5 секундам. Поэтому быстрое встряхивание мышью, когда экранная заставка включается, отключает его. Однако с более высоким значением у вас могут быть часы без пароля
Hennes
1
Льготный период не работает для меня, в то время как сценарий работает. Я предполагаю, что моя корпоративная политика также отключает льготный период.
датчанин Джейкоб Хэмптон

Ответы:

85

Я использую скрипт, который я называю idle.vbs:

Dim objResult

Set objShell = WScript.CreateObject("WScript.Shell")    

Do While True
  objResult = objShell.sendkeys("{NUMLOCK}{NUMLOCK}")
  Wscript.Sleep (6000)
Loop

Каждые шесть секунд, это быстро переключает numlock на клавиатуре, заставляя Windows полагать, что кто-то взаимодействует с клавиатурой, предотвращая блокировку экрана. Это работает на ванильных окнах, вам не нужны средства разработки или сценарии, чтобы использовать его, просто создайте текстовый файл с расширением .vbs и дважды щелкните по нему (или поместите его в элементы автозагрузки).

Изменить: вы можете поместить этот скрипт в элементы автозагрузки с помощью

 choco install IdleVbs -source https://www.myget.org/F/joshrivers-utility/

Для получения дополнительной информации об установщике chocoинтерфейса командной строки Choclatey ( ) см.

https://chocolatey.org/

JoshRivers
источник
@JoshRivers был бы неплохо остановить этот скрипт без перезагрузки компьютера.
DeeJayh
2
@DeeJayh Я думаю, что вы можете просто найти экземпляр wscript.exe в диспетчере задач и убить его. Обычно не так много экземпляров этого исполняемого файла. Возможно, вы могли бы сделать автоматическое решение для терминации ( stackoverflow.com/a/22325745 ) или поместить код в раздел «Пока», который отслеживает внешние факты. Например, скрипт должен создать файл при запуске, а затем проверить, что файл существует в то время как. Таким образом, вы можете просто удалить файл, чтобы скрипт завершился. (Я никогда не бросаю эту штуку, поэтому просто запускаю скрипт и очень редко убиваю его с помощью диспетчера задач).
JoshRivers
1
В Windows 10 простой способ найти папку запуска - открыть окно «Пуск»> «Выполнить» (например, WindowsKey + R) и затем ввести текст shell:startup. Смотрите этот сайт для получения дополнительной информации thewindowsclub.com/startup-folder-in-windows-8
buzz3791
Чтобы найти скрипт, найдите Microsoft Windows Based Script Host в вашем диспетчере задач. Или добавьте столбец Имя процесса, а затем найдите wscript.exe.
Джон Эндрюс
Отлично работает на ноутбуке с Win10 Surface - у него даже нет физического ключа NumLock!
Шахар
87

Если проигрыватель Windows Media все еще установлен, вы можете воспроизводить видео в цикле и минимизировать его (для этого отлично подойдут примеры видео «Дикой природы»). По умолчанию, пока воспроизводится видео, экран не блокируется.

omaha_brad
источник
3
Спасибо! Это самое простое, наиболее эффективное решение. (Я не пробовал, хотя, я покинул компанию некоторое время назад и постарался держаться подальше от Windows.)
Габриэль Р.
5
Я подтверждаю, что это работает в Windows XP с использованием файла MP3 вместо видео.
Алаа Али
4
Блестящий взлом!
3
Это также работает с использованием VLC для тех, кто предпочитает его проигрывателю Windows Media
ecoe
4
Прекрасно работает в Windows 7. Отличный хак!
Невес
16

Еще один вариант - бесплатная программа « Кофеин ». Это бесплатно для коммерческого использования, а также. С домашней страницы программы:

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

Кофеин работает, имитируя событие нажатия клавиши F15 каждые 59 секунд. Из всех доступных нажатий клавиша F15, вероятно, наименее навязчива (я никогда не видела клавиатуру ПК с этой клавишей!) И реже всего мешает вашей работе.

Это готовое решение также позволяет вам контролировать, когда включать и отключать его:

Двойной щелчок на значке программы опустошает кофейник, который представляет собой значок, и временно отключает программу. Двойной щелчок по нему снова наполняет горшок, и ваша машина будет бодрствовать.

Илья Курносов
источник
8
Я жду того дня, когда сотрудник
правительства поместит
Хорошее простое решение "с полки", спасибо. Кажется, у него столько же параметров командной строки, сколько у gcc, но мне не нужно использовать ни один из них!
Сэм Уоткинс
Инструмент отлично работает для меня! Мне пришлось установить распространяемый Visual C ++ 2008, чтобы он работал. microsoft.com/en-us/download/details.aspx?id=26368
Synck
7

Вы можете создать скрипт AutoIt, чтобы либо непрерывно нажимать неиспользуемую клавишу (например, сделать так, чтобы она переключала num lock, scroll lock), спать в течение минуты или около того и повторять. В качестве альтернативы, если вы часто используете клавиатуру, вы можете заставить ее перемещать мышь на пиксель или около того в любом направлении.

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

И это очень простой скрипт для выполнения невидимого движения мышью, если вы не хотите использовать синтаксис AutoIt:

While True
   Local $pos = MouseGetPos()
   MouseMove($pos[0]-1, $pos[1]-1, 0)
   MouseMove($pos[0], $pos[1], 0)
   Sleep(540000)
WEnd

Этот скрипт перемещает курсор мыши на один пиксель в направлении вверх-влево, а затем возвращает его обратно, затем спит в течение 9 минут ( 540000миллисекунд). Когда скрипт запущен, вы можете увидеть значок AutoIt в трее. Вы можете остановить его, щелкнув правой кнопкой мыши на этом значке и выбрав соответствующую опцию.

Чтобы создать сценарий, установите AutoIt, щелкните правой кнопкой мыши в любой папке и выберите New> AutoIt v3 Script, назовите его, щелкните правой кнопкой мыши этот новый сценарий, выберите Edit, вставьте приведенный выше код и сохраните. Вы даже можете скомпилировать его .exe(опять же, из контекстного меню), чтобы запустить, например, из планировщика Windows.

Прорвать
источник
Спасибо, я проверю, кажется, проще, чем установка клетки колеса мыши :)
Габриэль Р.
Предварительно скомпилированная версия этого скрипта AutoIt здесь symantec.com/connect/downloads/…
JJS
5

Скомпилируйте это в Visual Studio или C # Express и запустите его из командной строки (или дважды щелкните по нему). Требуется .NET 4.0 или выше. Он делает все, что вы ищете.

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.ComponentModel;
using System.Data;
using System.Diagnostics;
using System.Threading;
using System.Runtime.InteropServices;
using System.Windows.Forms; 

namespace ImWorkin
{
    class Program
    {
        [FlagsAttribute]
        public enum EXECUTION_STATE : uint
        {
            ES_SYSTEM_REQUIRED = 0x00000001,
            ES_DISPLAY_REQUIRED = 0x00000002,
            ES_CONTINUOUS = 0x80000000
        }
        public SYSTEMTIMEOUTS TimeOuts
        {
            get { return sysTimeouts; }
        }
        public struct SYSTEMTIMEOUTS
        {
            public int BATTERYIDLETIMEOUT;
            public int EXTERNALIDLETIMEOUT;
            public int WAKEUPIDLETIMEOUT;
        }

        [DllImport("USER32.DLL", CharSet = CharSet.Unicode)]
        public static extern IntPtr FindWindow(string lpClassName, string lpWindowName);

        [DllImport("USER32.DLL")]
        public static extern bool SetForegroundWindow(IntPtr hWnd);

        [DllImport("kernel32.dll", CharSet = CharSet.Auto, SetLastError = true)]
        static extern EXECUTION_STATE SetThreadExecutionState(EXECUTION_STATE flags);

        [DllImport("user32.dll", SetLastError = true, EntryPoint ="SystemParametersInfo")]
        internal static extern int SystemParametersInfo(int uiAction, int uiParam, ref int pvParam, int fWinIni);

        private static System.Threading.Timer preventSleepTimer = null;
        public const int SPI_GETBATTERYIDLETIMEOUT = 252;
        public const int SPI_GETEXTERNALIDLETIMEOUT = 254;
        public const int SPI_GETWAKEUPIDLETIMEOUT = 256;
        public static int Counter = 0;
        public static int timeOutinMS = 0;
        public static int batteryIdleTimer;
        public static int externalIdleTimer;
        public static int wakeupIdleTimer;
        public static SYSTEMTIMEOUTS sysTimeouts;


        static void Main(string[] args)
        {
            Console.WriteLine("You are about to be workin!! Just a moment...I need to calculate a few values.");
            string dots = string.Empty;
            for (int i =2; i < 60; i++)
            {
                dots = "";
                for (int ii = 0; ii < i; ii++)
                {
                    dots = dots + ".";
                }
                Thread.Sleep(100);
                Console.Clear();
                Console.WriteLine("You are about to be workin!! Just a moment...I need to calculate a few values.");
                Console.WriteLine(dots);
            }


            GetSystemTimeOuts();


            if (timeOutinMS < sysTimeouts.BATTERYIDLETIMEOUT)
                timeOutinMS = sysTimeouts.BATTERYIDLETIMEOUT;
            if (timeOutinMS < sysTimeouts.EXTERNALIDLETIMEOUT)
                timeOutinMS = sysTimeouts.EXTERNALIDLETIMEOUT;
            if (timeOutinMS < sysTimeouts.WAKEUPIDLETIMEOUT)
                timeOutinMS = sysTimeouts.WAKEUPIDLETIMEOUT;

            if (timeOutinMS == 0)
                timeOutinMS = 30;

            DisableDeviceSleep();
            Console.WriteLine("");
            Console.WriteLine("");
            Console.WriteLine("OK. I have calculated your computers timeout periods and set the   ");
            Console.WriteLine("necessary hooks. Your computer will not shut off the monitor, will");
            Console.WriteLine("show active in any chat programs,the screensaver is disabled and ");
            Console.WriteLine("the computer will not lock! Anyone looking at you eaither locally ");
            Console.WriteLine("or remotely will think you are hard at work.");
            Console.WriteLine("");
            Console.WriteLine("Now go do something fun...I got your back ;)");
            Console.WriteLine("Oh yeah....if you close this window OR press `q' in this ");
            Console.WriteLine("window you are going to have to actually work.");
            Console.WriteLine("");
            Console.WriteLine("");
            Console.WriteLine("This text will disappear in a 30 seconds. Just in case someone comes ");
            Console.WriteLine("by and reads your screen!");
            Console.WriteLine("");
            Console.WriteLine("");
            Console.WriteLine("Need custom coding? Kenneth.gore@gmail.com");
            while (Console.KeyAvailable == false)
            {
                Thread.Sleep(250);
                ConsoleKeyInfo cki = Console.ReadKey(true);

                if (cki.KeyChar == 'q')
                    break;
            }

        }


        public static void DisableDeviceSleep()
        {
           SetThreadExecutionState(EXECUTION_STATE.ES_SYSTEM_REQUIRED | EXECUTION_STATE.ES_DISPLAY_REQUIRED | EXECUTION_STATE.ES_CONTINUOUS);
           preventSleepTimer = new System.Threading.Timer(new TimerCallback(PokeDeviceToKeepAwake), null, 0, timeOutinMS * 1000);
        }

        public static void EnableDeviceSleep()
        {

           preventSleepTimer.Dispose();
           preventSleepTimer = null;

        }

        private static void PokeDeviceToKeepAwake(object extra)
        {

            Counter++;
            try
            {
                   SetThreadExecutionState(EXECUTION_STATE.ES_SYSTEM_REQUIRED | EXECUTION_STATE.ES_DISPLAY_REQUIRED | EXECUTION_STATE.ES_CONTINUOUS);
                   IntPtr Handle = FindWindow("SysListView32", "FolderView");

                   if (Handle == IntPtr.Zero)
                   {
                       SetForegroundWindow(Handle);
                       SendKeys.SendWait("%1");
                   }

                   if (Counter > 1)
                       Console.Clear();
            } 
            catch 
            {

            }
        }

        public static void GetSystemTimeOuts()  
        {
            sysTimeouts.BATTERYIDLETIMEOUT = -2;
            sysTimeouts.EXTERNALIDLETIMEOUT = -2;
            sysTimeouts.WAKEUPIDLETIMEOUT = -2;


            if (SystemParametersInfo(SPI_GETBATTERYIDLETIMEOUT, 0, ref batteryIdleTimer, 0) == 1)
                sysTimeouts.BATTERYIDLETIMEOUT = batteryIdleTimer;
            else
                sysTimeouts.BATTERYIDLETIMEOUT = -1;

            if (SystemParametersInfo(SPI_GETEXTERNALIDLETIMEOUT, 0, ref externalIdleTimer, 0) == 1)
                sysTimeouts.EXTERNALIDLETIMEOUT = externalIdleTimer;
            else
                sysTimeouts.EXTERNALIDLETIMEOUT = -1;



            if (SystemParametersInfo(SPI_GETWAKEUPIDLETIMEOUT, 0, ref wakeupIdleTimer, 0) == 1)
                sysTimeouts.WAKEUPIDLETIMEOUT = wakeupIdleTimer;
            else
                sysTimeouts.WAKEUPIDLETIMEOUT = -1;


        }
    }
}
user205533
источник
Извините .... в вышеприведенном посте все после фразы "Ищу". это код и должен быть скомпилирован. Это не правильно отформатировать. Код демонстрирует довольно интересный pInvoke для интересующихся. Кстати .... после компиляции я просто поместил его в мой путь где-то вроде c: \ windows. Таким образом, если я нахожусь в приглашении cmd, я могу напечатать ImWorkin, и я готов идти :)
user205533
1
Вы можете изменить свой ответ, нажав на редактирование ссылку ниже.
Деннис
пожалуйста, отредактируйте свой первый ответ и затем удалите этот.
Тейлин
6
WTF разработал «Минуточку, я вычисляю несколько значений!» фиктивная петля?
KalEl
6
В ответ на размещенный код c # его обычно принято отдавать должное автору. Это случилось со мной. Я написал это почти два года назад в переполнении стека, я полагаю.
2

Мне нравится использовать простые и интегрированные опции ( без дополнительного программного обеспечения ), например, скрипт powershell (спасибо https://dmitrysotnikov.wordpress.com/2009/06/29/prevent-desktop-lock-or-screensaver-with-powershell/ ) который использует «f15» как ключ к успеху (спасибо кофеину. Это действительно меньше всего мешает)

param($minutes = 180)

write "... screen will be awake for $minutes"

 $myshell = New-Object -com "Wscript.Shell"

 for ($i = 0; $i -lt $minutes; $i++) {
 write "... screen will be awake for" ($minutes-$i)
 Start-Sleep -Seconds 60    
 $myshell.sendkeys("{F15}")
}

Поместите это в myScriptName.ps1 и запустите его с помощью ярлыка на рабочем столе или командной строки: C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe -nop "C:\Users\myUser\Desktop\myScriptName.ps1"

ОБНОВЛЕНИЕ: Возможно, были некоторые изменения от администратора, но это больше не работает для меня. Теперь я должен использовать скрипт autohotkey из NBirnel: https://github.com/nbirnel/nosleep - это отлично работает , потому что это двигает мышь (не отвлекаясь на какую-либо работу)

Eli
источник
Я запускаю код, но получаю следующую ошибку. Пожалуйста, сообщите c:\Powershell>powershell -nop myScriptName.ps1 myScriptName.ps1 : The term 'myScriptName.ps1' is not recognized as the name of a cmdlet, function, script file, or operable program. Check the spelling of the name, or if a path was included, verify that the path is correct and try again. At line:1 char:1 + myScriptName.ps1 + ~~~~~~~~~~~~~~~~ + CategoryInfo : ObjectNotFound: (myScriptName.ps1:String) [], CommandNotFoundException + FullyQualifiedErrorId : CommandNotFoundException c:\Powershell>
Сабрина
@Sabrina, возможно, вам нужно определить полный путь к вашему сценарию, поэтому не просто "myScriptName.ps1", но "c: \ path \ to \ myScriptName.ps1"
eli
1

В моем случае именно эта строчка сделала свое дело:

SendKeys.Send("{CAPSLOCK}");

Просто поместите его в Timer_Tickсобытие и установите интервал таймера, например, 60000 мс.

user3540753
источник
1
Хорошо, уже довольно поздно, чтобы возобновить этот ответ, но рассмотрите возможность отправки не одного, а двух CAPSLOCK, если вы не хотите, чтобы я продолжал кричать в середине комментария STACKOVerflow, не понимая, почему (это займет пару минут, чтобы написать этот комментарий)
Джан Паоло
@ ДжанПаоло, ты прав. Это то, что я сделал. Я думал, что это понятно, но, возможно, я должен изменить ответ.
user3540753
-1

Правильный способ справиться с этим:

  • зайти в реестр где политика
  • установите значение на то, что вы хотите
  • и изменить разрешения раздела реестра
  • только запретить запись кому-либо, кроме вас
Ян Бойд
источник
Когда администраторы отключают настройки блокировки экрана, редактирование реестра уже отключено.
Габриэль Р.
@GabrielR. Как администратор вы можете изменять ACL для ключей реестра. Если я наберусь терпения, я свяжу доклад Марка Руссиновича, где он упоминает об избавлении от групповой политики Microsoft, которая блокировала его собственный ноутбук. Если вы администратор, у вас есть полный контроль над машиной. Скорее всего, он должен начинаться с того, чтобы стать владельцем ключей реестра, затем предоставить себе полный контроль, а затем запретить кому-либо еще что-либо, кроме доступа для чтения.
Ян Бойд
-5

Вы должны отключить «блокировку экрана» / «спящий режим» на панели управления> параметры питания> изменить настройки плана. В ней нажмите на выпадающий список «Переведите компьютер в спящий режим» и выберите «никогда».

РАДЖЕШ БАНСАЛ
источник
4
Администраторы домена могут иметь принудительную блокировку экрана в Windows.
Габриэль Р.