Come posso impedire un blocco dello schermo forzato in Windows 7?


96

Il nostro BOFH aziendale impone l'impostazione del blocco schermo con un ritardo ridicolmente breve. È frustrante e controproducente.

C'è un modo per impedire il blocco automatico dello schermo? Suppongo che non vi sia alcun modo per ignorare l'impostazione forzata, ma forse esiste un software che imita l'attività dell'utente.

Ho solo chiesto prima di impostare una rotellina del mouse perpetua. (prendilo?)


1
Solo curioso di sapere cos'è "ridicolmente breve"?
Carl,

Ci sono soluzioni alternative come pressori chiave e motori di topo che impediscono lo schermo di bloccarsi. Ma sei sicuro di volerlo fare? L'elusione della sicurezza IT è più che probabile contro la politica aziendale e potrebbe essere un reato attivabile.
Keltari,

7
15 minuti. OK, non è così corto ... a meno che tu non sia a casa, non in uno spazio aperto, e spesso lavori anche su un secondo computer. Come me, quindi il blocco dello schermo è odioso.
Gabriel R.

Una soluzione parziale non è quella di bloccare lo screensaver, ma di impostare il periodo di tolleranza su alcune ore. (Questo è il tempo che intercorre tra l'inizio dello screensaver e il momento in cui è necessario inserire una password. Di solito è impostato su 5 secondi. Pertanto, una scossa veloce con il mouse quando lo screensaver si avvia, lo disabilita. Tuttavia, con un valore più alto puoi avere ore senza password.
Hennes

1
Il periodo di grazia non funziona per me, mentre lo script funziona. Presumo che la mia politica aziendale disabiliti anche il periodo di tolleranza.
Dane Jacob Hampton,

Risposte:


85

Uso uno script che titolo idle.vbs:

Dim objResult

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

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

Ogni sei secondi, questo commuta rapidamente il blocco numerico sulla tastiera, facendo credere a Windows che qualcuno stia interagendo con la tastiera, impedendo il blocco dello schermo. Funziona su windows vanilla, non hai bisogno di strumenti di sviluppo o di scripting per usarlo, basta creare un file di testo con .vbs come estensione e fare doppio clic su di esso (o posizionarlo negli elementi di avvio).

Modifica: puoi inserire questo script nei tuoi elementi di avvio con

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

Per ulteriori informazioni sul programma di chocoinstallazione della CLI di Choclatey ( ), consultare:

https://chocolatey.org/


@JoshRivers sarebbe anche un modo per fermare questo script, senza dover riavviare il computer.
DeeJayh,

2
@DeeJayh Penso che puoi semplicemente trovare l'istanza di wscript.exe in Task Manager e ucciderlo. Di solito non ci sono molte istanze dell'eseguibile in esecuzione. Probabilmente potresti creare una soluzione automatizzata per la risoluzione ( stackoverflow.com/a/22325745 ) o inserendo il codice nella sezione Do While che controlla un fatto esterno. Come se lo script creasse un file all'avvio, quindi controlla che il file esista in While. In questo modo potresti semplicemente eliminare il file per terminare lo script. (Non ho mai lasciato la cosa, però, quindi eseguo solo lo script e molto raramente lo uccido con Task Manager).
JoshRivers

1
Su Windows 10, un modo semplice per individuare la cartella di avvio è visualizzare la finestra Start-> Esegui (ad esempio WindowsKey + R) e quindi digitare shell:startup. Visita questo sito per maggiori informazioni thewindowsclub.com/startup-folder-in-windows-8
buzz3791

Per trovare lo script, cerca Host di script basato su Microsoft Windows nel tuo task manager. Oppure aggiungi una colonna Nome processo e cerca wscript.exe.
JohnAndrews

Funziona alla grande su un laptop Win10 Surface - che non ha nemmeno una chiave NumLock fisica!
Shahar

87

Se Windows Media Player è ancora installato, puoi riprodurre un video in loop e minimizzarlo (i video di esempio "Wildlife" funzionano bene per questo). Per impostazione predefinita, finché un video è in riproduzione, lo schermo non si blocca.


3
Grazie! Questa è la soluzione più semplice ed efficace. (Non ci ho provato, ho lasciato la compagnia qualche tempo fa e ho cercato di stare lontano da Windows.)
Gabriel R.

5
Confermo che questo funziona su Windows XP utilizzando un file MP3 anziché un video.
Alaa Ali,

4
Incisione brillante!

3
Questo funziona anche usando VLC per coloro che lo preferiscono a Windows Media Player
ecoe

4
Funziona bene in Windows 7. Bello hack!
nevica il

16

Un'altra opzione è il programma gratuito di caffeina . È gratuito anche per uso commerciale. Dalla homepage del programma:

Se hai problemi con il blocco del tuo PC o vai a dormire, la caffeina la terrà sveglia. Funziona simulando la pressione di un tasto una volta ogni 59 secondi, quindi la tua macchina pensa che stai ancora lavorando sulla tastiera, quindi non bloccherà lo schermo né attiverà lo screensaver.

La caffeina funziona simulando un evento key-up F15 ogni 59 secondi. Di tutti i tasti disponibili, F15 è probabilmente il meno invadente (non ho mai visto una tastiera per PC con quel tasto!) E probabilmente non interferisce con il tuo lavoro.

Questa soluzione standard consente inoltre di controllare quando abilitarlo e disabilitarlo:

Facendo doppio clic sull'icona del programma si svuota la caffettiera, che è ciò che l'icona rappresenta, e disabilita temporaneamente il programma. Facendo doppio clic di nuovo, si riempie nuovamente il piatto e si mantiene sveglia la macchina.


8
Sto aspettando il giorno in cui un dipendente di Gov't mette la caffeina sul computer e succede che qualcosa come Shift + F15 lancia le bombe atomiche ...
kazoni

Bella soluzione "pronta all'uso", grazie. Sembra avere circa tutte le opzioni della riga di comando di gcc, ma non ho bisogno di usarle!
Sam Watkins,

Lo strumento funziona benissimo per me! Ho dovuto installare il ridistribuibile Visual C ++ 2008 per farlo funzionare. microsoft.com/en-us/download/details.aspx?id=26368
Synck

7

È possibile creare uno script AutoIt per premere continuamente un tasto inutilizzato (ad esempio, per attivare o disattivare il blocco numerico, il blocco dello scorrimento), dormire per circa un minuto e ripetere. In alternativa, se usi molto la tastiera, puoi far muovere il mouse di circa un pixel in qualsiasi direzione.

Se non si desidera che funzioni continuamente, è possibile avviare lo script come attività pianificata (se si dispone dell'accesso) da avviare dopo che il computer è rimasto inattivo per qualche tempo.

E questo è uno script molto semplice per eseguire una mossa invisibile del mouse, se non vuoi entrare nella sintassi di AutoIt:

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

Questo script sposta il cursore del mouse di un pixel nella direzione in alto a sinistra, dopodiché lo restituisce, quindi dorme per 9 minuti ( 540000millisecondi). Quando lo script è in esecuzione, puoi vedere l'icona AutoIt nella barra delle applicazioni. Puoi interromperlo facendo clic con il pulsante destro del mouse su questa icona e scegliendo l'opzione corrispondente.

Per creare uno script, installa AutoIt, fai clic con il pulsante destro del mouse in qualsiasi cartella e scegli New> AutoIt v3 Script, nominalo, fai clic con il pulsante destro del mouse su questo nuovo script, scegli Edit, incolla il codice fornito sopra e salva. Puoi persino compilarlo in .exe(di nuovo, dal menu contestuale) per iniziare, ad esempio, da Windows Scheduler.


Grazie, lo controllerò, sembra più semplice di una configurazione della gabbia della rotellina del mouse :)
Gabriel R.

Versione precompilata di questo script AutoIt qui symantec.com/connect/downloads/…
JJS

5

Compilalo in Visual Studio o C # Express ed eseguilo da un prompt dei comandi (o fai doppio clic su di esso). Richiede .NET 4.0 o versioni successive. Fa tutto quello che stai cercando.

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;


        }
    }
}

Scusa .... nel post sopra tutto dopo la frase "In cerca di". è un codice e deve essere compilato. Non è stato formattato correttamente. Il codice mostra alcuni pInvoke piuttosto interessanti per gli interessati. A proposito .... dopo la compilazione, l'ho appena messo nel mio percorso da qualche parte come c: \ windows. In questo modo, se ricevo un prompt cmd, posso digitare ImWorkin e sono pronto per andare :)
user205533

1
Puoi modificare la tua risposta facendo clic sul collegamento Modifica sotto di essa.
Dennis

si prega di modificare la prima risposta e quindi eliminare questa.
teylyn

6
WTF ha il "Solo un momento, sto calcolando alcuni valori!" anello fittizio?
KalEl

6
In risposta al codice c # pubblicato è di solito consuetudine dare credito all'autore. Questo succede a me. L'ho pubblicato quasi due anni fa nello stack Overflow credo.


2

Mi piace usare opzioni facili e integrate ( nessun software aggiuntivo ), come uno script PowerShell (grazie https://dmitrysotnikov.wordpress.com/2009/06/29/prevent-desktop-lock-or-screensaver-with-powershell/ ) che utilizza la "f15" come chiave per il successo (grazie alla caffeina. In effetti è meno interferente)

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

Inseriscilo in myScriptName.ps1 e avvialo tramite collegamento sul desktop o riga di comando: C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe -nop "C:\Users\myUser\Desktop\myScriptName.ps1"

AGGIORNAMENTO: Forse c'è stato qualche cambiamento da parte dell'amministratore, ma questo non funziona più per me Ora devo usare uno script autohotkey da NBirnel: https://github.com/nbirnel/nosleep - questo lavoro è perfetto , perché sposta il mouse (senza distrarre alcun lavoro)


Eseguo il codice ma ottengo il seguente errore. Si prega di avvisare 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 forse devi definire il percorso completo del tuo script, quindi non solo "myScriptName.ps1" ma "c: \ path \ to \ myScriptName.ps1"
eli

1

Nel mio caso, solo questa linea ha funzionato:

SendKeys.Send("{CAPSLOCK}");

Basta metterlo nella Timer_Tickmanifestazione e impostare l'intervallo del timer, ad esempio, 60000ms.


1
ok, è abbastanza tardi per riprendere questa risposta, ma considera di non inviare una, ma due maiuscole se non vuoi che io STAI GRIDANDO NEL MEZZO DI UNO STACKOver commenta flusso senza capire perché (ci sono voluti un paio di minuti per scrivere questo commento)
Gian Paolo,

@GianPaolo hai ragione. Questo è quello che ho fatto. Ho pensato che fosse chiaro, ma forse dovrei modificare la risposta.
user3540753


-1

Il modo corretto di gestirlo è:

  • vai nel registro dove si trova la politica
  • imposta il valore su quello che vuoi
  • e modificare le autorizzazioni della chiave di registro
  • solo Nega l'accesso in scrittura a nessuno, tranne te stesso

Quando gli amministratori disabilitano le impostazioni di blocco dello schermo, la modifica del registro è già disabilitata.
Gabriel R.,

@GabrielR. Come amministratore puoi modificare l'ACL sulle chiavi di registro. Se avrò la pazienza collegherò il discorso di Mark Russinovish in cui menziona come sbarazzarsi della politica di gruppo Microsoft che ha bloccato il proprio laptop. Se sei un amministratore hai il pieno controllo della macchina. Probabilmente deve iniziare con l'assunzione della proprietà delle chiavi di registro, quindi con il pieno controllo, negando a chiunque altro che l'accesso in lettura.
Ian Boyd,

-5

È necessario disabilitare "Blocco schermo" / "Modalità sospensione" dal pannello di controllo> Opzioni risparmio energia> Modifica impostazioni piano. Fare clic sul menu a discesa per "Sospendi il computer" e selezionare "mai".


4
Gli amministratori di dominio possono avere un blocco schermo forzato in Windows.
Gabriel R.,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.