Jak mogę zapobiec wymuszonej blokadzie ekranu w systemie Windows 7?

96

Nasza korporacyjna firma BOFH narzuca ustawienie blokady ekranu w absurdalnie krótkim czasie. Jest to frustrujące i przynosi efekt przeciwny do zamierzonego.

Czy istnieje sposób, aby zapobiec automatycznej blokadzie ekranu? Zakładam, że nie ma sposobu na zastąpienie ustawień wymuszonych przez zasady, ale może istnieje oprogramowanie, które naśladuje aktywność użytkownika.

Tylko pytam, zanim ustawię wieczne kółko myszy. (zdobyć?)

Gabriel R.
źródło
1
Ciekawe, co to „absurdalnie krótki”?
Carl
Tam obejścia jak kluczowych tłoczników prasujących i ładowanie myszy, które zapobiegają blokowaniu ekranu. Ale czy na pewno chcesz to zrobić? Ominięcie bezpieczeństwa IT jest bardziej niż prawdopodobne wbrew polityce firmy i może być przestępstwem zagrożonym pożarem.
Keltari
7
15 minut. OK, to nie jest takie krótkie ... chyba że jesteś w domu, nie na otwartej przestrzeni, a także często pracujesz na drugim komputerze. Tak jak ja, więc blokada ekranu jest nieznośna.
Gabriel R.
Jedno pół obejście nie polega na blokowaniu wygaszacza ekranu, ale na ustawieniu okresu karencji na kilka godzin. (Jest to czas między uruchomieniem wygaszacza ekranu a czasem, w którym musisz wprowadzić hasło. Zwykle jest to ustawione na 5 sekund. Więc szybkie potrząśnięcie myszą, gdy wygaszacz ekranu uruchamia się, wyłącza je. Jednak przy wyższej wartości możesz mieć godziny bez hasła
Hennes,
1
Okres karencji nie działa dla mnie, podczas gdy skrypt działa. Zakładam, że moja polityka korporacyjna wyłącza także okres karencji.
Dane Jacob Hampton

Odpowiedzi:

85

Używam skryptu, który tytuł idle.vbs:

Dim objResult

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

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

Co sześć sekund szybko przełącza się to na klawiaturę numlock, powodując, że Windows wierzy, że ktoś wchodzi w interakcję z klawiaturą, zapobiegając blokadzie ekranu. Działa to w oknach waniliowych, nie potrzebujesz narzędzi programistycznych ani skryptowych, aby go użyć, po prostu utwórz plik tekstowy z rozszerzeniem .vbs i kliknij go dwukrotnie (lub umieść w elementach startowych).

Edycja: możesz umieścić ten skrypt w elementach startowych za pomocą

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

Aby uzyskać więcej informacji na temat chocoinstalatora CLI Choclatey ( ), zobacz:

https://chocolatey.org/

JoshRivers
źródło
@JoshRivers sposób na zatrzymanie tego skryptu, bez konieczności ponownego uruchamiania komputera, również byłby miły.
DeeJayh
2
@DeeJayh Myślę, że możesz po prostu znaleźć instancję wscript.exe w Menedżerze zadań i ją zabić. Zazwyczaj nie ma wielu uruchomionych plików wykonywalnych. Prawdopodobnie możesz stworzyć zautomatyzowane rozwiązanie do rozwiązania umowy ( stackoverflow.com/a/22325745 ) lub umieszczając kod w sekcji Do While, która zwraca uwagę na fakt zewnętrzny. Podobnie jak skrypt tworzy plik podczas uruchamiania, a następnie sprawdź, czy plik istnieje w While. W ten sposób możesz po prostu usunąć plik, aby skrypt został zakończony. (Nigdy jednak nie rezygnuję z tego, więc po prostu uruchamiam skrypt i bardzo rzadko go zabijam za pomocą Menedżera zadań).
JoshRivers
1
W systemie Windows 10 łatwym sposobem na zlokalizowanie folderu startowego jest wyświetlenie okna Start-> Uruchom (np. WindowsKey + R), a następnie wpisz shell:startup. Zobacz tę stronę, aby uzyskać więcej informacji thewindowsclub.com/startup-folder-in-windows-8
buzz3791
Aby znaleźć skrypt, poszukaj hosta skryptów opartego na systemie Microsoft Windows w menedżerze zadań. Lub dodaj kolumnę Nazwa procesu, a następnie poszukaj wscript.exe.
JohnAndrews
Działa świetnie na laptopie Win10 Surface - który nie ma nawet fizycznego klawisza NumLock!
Shahar,
87

Jeśli program Windows Media Player jest nadal zainstalowany, możesz odtwarzać wideo w pętli i minimalizować je (przykładowe filmy z dzikiej przyrody działają w tym przypadku dobrze). Domyślnie, dopóki wideo jest odtwarzane, ekran się nie blokuje.

omaha_brad
źródło
3
Dziękuję Ci! To najprostsze i najbardziej skuteczne rozwiązanie. (Jednak tego nie próbowałem, jakiś czas temu opuściłem firmę i starałem się trzymać z dala od systemu Windows.)
Gabriel R.,
5
Potwierdzam, że działa to w systemie Windows XP przy użyciu pliku MP3 zamiast wideo.
Alaa Ali,
4
Genialny hack!
3
Działa to również przy użyciu VLC dla tych, którzy wolą go od Windows Media Player
ecoe
4
Działa dobrze w systemie Windows 7. Niezły hack!
neves
16

Jeszcze inną opcją jest darmowy program Caffeine . Jest również bezpłatny do użytku komercyjnego. Ze strony głównej programu:

Jeśli masz problemy z blokowaniem komputera lub pójściem spać, kofeina nie zasypia. Działa poprzez symulację naciśnięcia klawisza raz na 59 sekund, dzięki czemu urządzenie myśli, że nadal pracujesz na klawiaturze, więc nie blokuje ekranu ani nie aktywuje wygaszacza ekranu.

Kofeina działa poprzez symulację zdarzenia F15 kluczowania co 59 sekund. Ze wszystkich dostępnych naciśnięć klawiszy, F15 jest prawdopodobnie najmniej inwazyjny (nigdy nie widziałem klawiatury komputera z tym klawiszem!) I najmniej prawdopodobne, aby zakłócał twoją pracę.

To gotowe rozwiązanie pozwala również kontrolować, kiedy włączyć lub wyłączyć:

Dwukrotne kliknięcie ikony programu opróżnia dzbanek kawy, który reprezentuje ikonę, i tymczasowo wyłącza program. Ponowne dwukrotne kliknięcie ponownie napełnia pulę i powoduje, że maszyna nie zasypia.

Ilya Kurnosov
źródło
8
Czekam na dzień, w którym pracownik Gov't umieści Kofeinę na swoim komputerze i tak się składa, że ​​coś takiego jak Shift + F15 uruchamia nuklearne ...
kazoni
Ładne, łatwe rozwiązanie „z półki”, dzięki. Wygląda na to, że ma tyle opcji wiersza poleceń, co gcc, ale nie muszę używać żadnej z nich!
Sam Watkins,
Narzędzie działa świetnie dla mnie! Musiałem zainstalować pakiet redystrybucyjny Visual C ++ 2008, aby działał. microsoft.com/en-us/download/details.aspx?id=26368
Synck
7

Możesz utworzyć skrypt AutoIt, aby stale naciskać nieużywany klawisz (np. Przełączać blokadę klawiszy num, przewijać), spać przez około minutę i powtarzać. Alternatywnie, jeśli często używasz klawiatury, możesz zmusić ją do poruszania myszą o piksel lub mniej więcej w dowolnym kierunku.

Jeśli nie chcesz, aby działał nieprzerwanie, możesz również uruchomić skrypt jako zaplanowane zadanie (jeśli masz dostęp) uruchamiane po pewnym czasie braku aktywności komputera.

Jest to bardzo prosty skrypt do wykonania niewidocznego ruchu myszy, jeśli nie chcesz wchodzić w składnię AutoIt:

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

Ten skrypt przesuwa kursor myszy o jeden piksel w górę w lewo, a następnie zwraca go z powrotem, a następnie śpi przez 9 minut ( 540000milisekund). Gdy skrypt jest uruchomiony, w zasobniku widoczna jest ikona AutoIt. Możesz go zatrzymać, klikając prawym przyciskiem myszy tę ikonę i wybierając odpowiednią opcję.

Aby utworzyć skrypt, zainstaluj AutoIt, kliknij prawym przyciskiem myszy dowolny folder i wybierz New> AutoIt v3 Script, nazwij go, kliknij prawym przyciskiem myszy ten nowy skrypt, wybierz Edit, wklej powyższy kod i zapisz. Możesz go nawet skompilować .exe(ponownie z menu kontekstowego), aby na przykład uruchomić z Windows Scheduler.

Przełom
źródło
Dzięki, sprawdzę to, wydaje się prostsze niż konfiguracja klatki kół myszy :)
Gabriel R.
Wstępnie skompilowana wersja tego skryptu AutoIt tutaj symantec.com/connect/downloads/…
JJS
5

Skompiluj to w Visual Studio lub C # Express i uruchom go z wiersza polecenia (lub kliknij dwukrotnie). Wymaga .NET 4.0 lub nowszej wersji. Robi wszystko, czego szukasz.

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? [email protected]");
            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;


        }
    }
}
użytkownik205533
źródło
Przepraszamy .... w powyższym poście wszystko po frazie „Szukasz”. jest kodem i powinien zostać skompilowany. Nie sformatował poprawnie. Kod pokazuje całkiem fajne pInvoke dla zainteresowanych. Btw .... po skompilowaniu, po prostu umieszczam go na swojej ścieżce gdzieś jak c: \ windows. W ten sposób, gdy pojawi się monit cmd, mogę wpisać ImWorkin i mogę zacząć :)
user205533
1
Możesz zmodyfikować swoją odpowiedź, klikając poniższy link edytuj .
Dennis
edytuj swoją pierwszą odpowiedź, a następnie usuń tę.
teylyn
6
WTF ma na myśli „Chwileczkę, obliczam kilka wartości!” obojętna pętla?
KalEl
6
W odpowiedzi na kod c # opublikowano zwykle zwyczaj uznania autora. Tak się składa, że ​​to ja. Sądzę, że zamieściłem to prawie dwa lata temu na stosie Przepełnienie.
2

Lubię korzystać z łatwych i zintegrowanych opcji ( bez dodatkowego oprogramowania ), takich jak skrypt programu PowerShell (dzięki https://dmitrysotnikov.wordpress.com/2009/06/29/prevent-desktop-lock-or-screensaver-with-powershell/ ), który wykorzystuje „f15” jako klucz do sukcesu (dzięki kofeinie. To rzeczywiście najmniej przeszkadza)

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}")
}

Umieść to w myScriptName.ps1 i uruchom za pomocą skrótu na pulpicie lub linii poleceń: C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe -nop "C:\Users\myUser\Desktop\myScriptName.ps1"

AKTUALIZACJA: Być może nastąpiła jakaś zmiana od administratora, ale to już dla mnie nie działa Teraz muszę użyć skryptu autohotkey z NBirnel: https://github.com/nbirnel/nosleep - to działa idealnie , ponieważ to porusza myszą (bez rozpraszania pracy)

eli
źródło
Uruchomiam kod, ale pojawia się następujący błąd. Proszę doradzić 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
@ Sabrina może musisz zdefiniować pełną ścieżkę do skryptu, więc nie tylko „myScriptName.ps1”, ale „c: \ path \ to \ myScriptName.ps1”
eli
1

W moim przypadku tylko jedna linia załatwiła sprawę:

SendKeys.Send("{CAPSLOCK}");

Wystarczy umieścić go w Timer_Tickzdarzeniu i ustawić interwał timera na np. 60000 ms.

użytkownik3540753
źródło
1
ok, jest już dość późno, aby wznowić tę odpowiedź, ale rozważ wysłanie nie jednego, ale dwóch CAPSLOCK, jeśli nie chcesz, żebym zaczął krzyczeć w środku komentarza STACKOVerflow bez zrozumienia dlaczego (napisanie tego komentarza zajmuje kilka minut)
Gian Paolo,
@GianPaolo masz rację. Oto co zrobiłem. Myślałem, że to jasne, ale może powinienem zmodyfikować odpowiedź.
user3540753
-1

Prawidłowy sposób obsługi to:

  • przejdź do rejestru, w którym znajduje się zasada
  • ustaw wartość na dowolną
  • i zmień uprawnienia klucza rejestru
  • tylko Odmów dostępu do zapisu nikomu oprócz ciebie
Ian Boyd
źródło
Gdy administratorzy wyłączą ustawienia blokady ekranu, edycja rejestru jest już wyłączona.
Gabriel R.
@GabrielR. Jako administrator możesz zmieniać listę ACL kluczy rejestru. Jeśli zdobędę cierpliwość, powiążę rozmowę Marka Russinovisha, w której wspomina o pozbyciu się zasad grupy Microsoft, które zablokowały jego laptopa. Jeśli jesteś administratorem, masz pełną kontrolę nad maszyną. Najprawdopodobniej musi zacząć od przejęcia na własność kluczy rejestru, a następnie przyznania sobie pełnej kontroli, a następnie odmowy dostępu innym osobom poza dostępem do odczytu.
Ian Boyd,
-5

Należy wyłączyć „blokadę ekranu” / „tryb uśpienia” z panelu sterowania> opcje zasilania> zmień ustawienia planu. Klika menu rozwijane „Uśpij komputer” i wybierz „Nigdy”.

RAJESH BANSAL
źródło
4
Administratorzy domen mogą mieć blokadę ekranu wymuszoną przez zasady w systemie Windows.
Gabriel R.,