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

256560
Gabriel R.

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

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

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

80
Просто любопытно, что такое "смехотворно короткий"? Carl 12 лет назад 0
Есть * обходные пути, такие как нажатия клавиш и движений мыши, которые предотвращают блокировку экрана. Но вы уверены, что хотите сделать это? Обход ИТ-безопасности более чем вероятен вопреки политике компании и может быть подделан. Keltari 12 лет назад 0
15 минут. Хорошо, это не так уж и мало ... если вы не дома, не на открытом пространстве, а также часто работаете на втором компьютере. Как и я, поэтому блокировка экрана противна. Gabriel R. 12 лет назад 3
Один из обходных путей состоит не в том, чтобы заблокировать заставку, а в том, чтобы установить льготный период на несколько часов. (Это время между запуском экранной заставки и временем, которое вам нужно ввести пароль. Обычно это значение равно 5 секундам. Поэтому быстрое встряхивание мышью, когда заставка только запускается, отключает его. Однако с более высоким значением Вы можете иметь часы без пароля. Hennes 10 лет назад 0
[Льготный период] (https://superuser.com/questions/329758/how-can-i-prevent-a-policy-enforced-screen-lock-in-windows-7/836346#comment880491_329758) не работает для меня пока [скрипт] (https://superuser.com/a/836346/137079) делает. Я предполагаю, что моя корпоративная политика также отключает льготный период. Dane Jacob Hampton 6 лет назад 0
Опоздал на игру здесь, но хотел добавить свое решение. Поскольку у меня нет прав администратора на ПК, который я использую на работе, и ни один из скриптов или программ в этой теме не работал для меня (либо они не были разрешены для установки, либо просто не работали), я приобрел аппаратное обеспечение USB Mouse Jiggle от Amazon. Работает как мечта, всего 15 долларов. Jeff Wright 6 лет назад 0

11 ответов на вопрос

75
omaha_brad

If Windows Media Player is still installed, you can play a video on loop and minimize it (the sample "Wildlife" videos work fine for this). By default, as long as a video is playing, the screen won't lock.

Спасибо! Это самое простое, наиболее эффективное решение. (Я не пробовал, хотя, я покинул компанию некоторое время назад и постарался держаться подальше от Windows.) Gabriel R. 11 лет назад 2
Я подтверждаю, что это работает в Windows XP с использованием файла MP3 вместо видео. Alaa Ali 10 лет назад 5
Блестящий взлом! 10 лет назад 3
Это также работает с использованием VLC для тех, кто предпочитает его проигрывателю Windows Media. ecoe 10 лет назад 3
Отличный хак. Я создал небольшое пустое видео и пакетные сценарии, чтобы начать это. Файлы на [box.net] (https://app.box.com/s/khcc45viol53oswmzo3v) и в блоге на [мой личный сайт] (http://www.ericcloninger.com/?p=578) Eric Cloninger 9 лет назад 3
@EricCloninger это не играет на W2k3 SP2 Media Player; хорошая идея, хотя kubanczyk 9 лет назад 1
@kubanczyk У меня были некоторые проблемы с WMP в Windows 7 для запуска в режиме цикла из сценария, но я мог запустить видео, а затем вручную выбрать кнопку цикла на панели управления. Eric Cloninger 9 лет назад 1
Прекрасно работает в Windows 7. Отличный хак! neves 7 лет назад 2
Воспроизведение видео занимает ваш процессор и ресурсы памяти ... Danijel 6 лет назад 0
Если вы используете VLC, это будет работать, только если видеоокно не свернуто (но оно может быть в фоновом режиме). Joe Mornin 6 лет назад 1
Это работает на Windows 7, воспроизводящей MP3 в свернутом Media Player вместо видео. Chris Jenks 5 лет назад 0
66
JoshRivers

I use a script I title idle.vbs:

Dim objResult Set objShell = WScript.CreateObject("WScript.Shell") Do While True objResult = objShell.sendkeys("") Wscript.Sleep (6000) Loop 

Every six seconds, this quickly toggles numlock on the keyboard, causing Windows to believe that someone is interacting with the keyboard, preventing screen lock. This runs on vanilla windows, you don't need development or scripting tools to use it, just make a text file with .vbs as the extension and double-click it (or place it in your startup items).

Edit: you can put this script in your startup items with

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

For more information on the Choclatey (choco) CLI installer please see:

https://chocolatey.org/

@JoshRivers был бы неплохо остановить этот скрипт без перезагрузки компьютера. DeeJayh 7 лет назад 0
@DeeJayh I think you can just find the instance of wscript.exe in Task Manager and kill it. There usually aren't a lot of instances of that executable running. You could probably make an automated solution for termination (http://stackoverflow.com/a/22325745) or by putting code in the Do While section that watches for an external fact. Like have the script create a file on startup, then check that the file exists in While. That way you could just delete the file to make the script terminate. (I never quit the thing, though, so I just run the script and very rarely kill it with Task Manager). JoshRivers 7 лет назад 2
В Windows 10 простой способ найти папку запуска - это открыть окно «Пуск»> «Выполнить» (например, WindowsKey + R), а затем набрать «shell: startup». Смотрите этот сайт для получения дополнительной информации http://www.thewindowsclub.com/startup-folder-in-windows-8 buzz3791 6 лет назад 1
Чтобы найти скрипт, найдите Microsoft Windows Based Script Host в вашем диспетчере задач. Или добавьте столбец Имя процесса и найдите wscript.exe. JohnAndrews 5 лет назад 0
10
Ilya Kurnosov

Yet another option is freeware Caffeine program. It is free for commercial use as well. From the program's homepage:

If you have problems with your PC locking or going to sleep, caffeine will keep it awake. It works by simulating a key-press once every 59 seconds, so your machine thinks you're still working at the keyboard, so won't lock the screen or activate the screensaver.

Caffeine works by simulating an F15 key up event every 59 seconds. Of all the key presses available, F15 is probably the least intrusive (I've never seen a PC keyboard with that key!), and least likely to interfere with your work.

This off-the-shelf solution also allows you to control when to enable it and disable it:

Double-clicking the program icon empties the coffee pot, which is what the icon represents, and temporarily disables the program. Double-clicking it again refills the pot, and will keep your machine awake.

Я жду того дня, когда сотрудник Gov't поместит кофеин на свой компьютер, и так получилось, что что-то вроде Shift + F15 запускает ядерное оружие ... kazoni 8 лет назад 6
Хорошее простое решение "с полки", спасибо. Кажется, у него столько же параметров командной строки, сколько и у gcc, но мне не нужно использовать ни один из них! Sam Watkins 7 лет назад 0
7
Breakthrough

Вы можете создать скрипт 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.

Спасибо, я проверю, кажется, проще, чем установка клетки колеса мыши :) Gabriel R. 12 лет назад 0
Предварительно скомпилированная версия этого скрипта AutoIt здесь https://www.symantec.com/connect/downloads/readynosleepexe-prevents-screensaver-and-pc-locking JJS 7 лет назад 0
5
user205533

Compile this in Visual Studio or C# Express and run it from a command prompt (or double click it). Requires .NET 4.0 or above. It does everything you are looking for.

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; } } } 
Извините .... в вышеприведенном посте все после фразы "Ищу". это код и должен быть скомпилирован. Это не правильно отформатировать. Код демонстрирует довольно крутой pInvoke для тех, кто заинтересован. Кстати .... после компиляции я просто поместил его в мой путь где-то вроде c: \ windows. Таким образом, если я нахожусь в приглашении cmd, я могу напечатать ImWorkin, и я готов идти :) user205533 11 лет назад 0
Вы можете изменить свой ответ, нажав на ссылку ** edit ** под ним. Dennis 11 лет назад 1
пожалуйста, отредактируйте свой первый ответ и затем удалите этот. teylyn 11 лет назад 0
WTF разработал «Минуточку, я вычисляю несколько значений!» фиктивная петля? KalEl 10 лет назад 6
В ответ на размещенный код c # его обычно принято отдавать должное автору. Это случилось со мной. Я написал это почти два года назад в переполнении стека, я полагаю. 9 лет назад 6
5
Matt

Существует приложение для Android под названием «Timeout Blocker», которое вибрирует с интервалом, и вы можете навести на него мышку. Это говорит не использовать это на работе все же. https://play.google.com/store/apps/details?id=com.isomerprogramming.application.timeoutblocker&hl=en

1
user3540753

In my case just this one line did the trick:

SendKeys.Send(""); 

Just put it in the Timer_Tick event and set timer interval to e.g. 60000ms.

Хорошо, уже довольно поздно, чтобы возобновить этот ответ, но рассмотрите возможность отправки не одного, а двух CAPSLOCK, если вы не хотите, чтобы я ЗАПИЩАЛ ЖАЛОК В СЕРЕДИНЕ STACKOVerflow-комментария, не понимая почему (для написания этого комментария требуется несколько минут) Gian Paolo 5 лет назад 0
@ ДжанПаоло, ты прав. Это то, что я сделал. Я думал, что это понятно, но, возможно, я должен изменить ответ. user3540753 5 лет назад 0
1
KERR

Мышь Jiggler может быть вариант: https://mousejiggler.codeplex.com/

Это работает просто отлично :) sunil 6 лет назад 0
1
eli

Мне нравится использовать простые и интегрированные опции ( без дополнительного программного обеспечения ), например скрипт 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("") } 

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

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

Я запускаю код, но получаю следующую ошибку. Пожалуйста, посоветуйте `c: \ Powershell> powershell -nop myScriptName.ps1 myScriptName.ps1: термин« myScriptName.ps1 »не распознается как имя командлета, функции, файла сценария или работоспособной программы. Проверьте правильность написания имени или, если путь был указан, проверьте правильность пути и повторите попытку. В строке: 1 символ: 1 + myScriptName.ps1 + ~~~~~~~~~~~~~~~~ + CategoryInfo: ObjectNotFound: (myScriptName.ps1: String) [], CommandNotFoundException + FullyQualifiedErrorId: CommandNotFoundException c: \ Powershell> ` Sabrina 5 лет назад 0
@Sabrina, возможно, вам нужно определить полный путь к вашему сценарию, поэтому не просто «myScriptName.ps1», но «c: \ path \ to \ myScriptName.ps1» eli 5 лет назад 0
-1
Ian Boyd

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

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