Como impedir um bloqueio de tela imposto por políticas no Windows 7?


96

Nosso BOFH corporativo impõe a configuração de bloqueio de tela com um atraso ridiculamente curto. É frustrante e contraproducente.

Existe uma maneira de impedir o bloqueio automático da tela? Eu diria que não há como substituir a configuração imposta por política, mas talvez haja um software que imite a atividade do usuário.

Perguntei antes de montar uma roda perpétua do mouse. (pegue?)


1
Apenas curioso o que "ridiculamente curto" é?
30811 Carl

Não são soluções alternativas, como prensas chave e motores de rato que vai impedir que a tela de bloqueio. Mas você tem certeza que deseja fazer isso? Contornar a segurança de TI é mais do que provável contra a política da empresa e pode ser uma ofensa passível de incêndio.
Keltari

7
15 minutos. OK, não é tão curto ... a menos que você esteja em casa, não esteja em um espaço aberto e também esteja sempre trabalhando em um segundo computador. Como eu sou, o bloqueio da tela é desagradável.
Gabriel R.

Uma solução alternativa é não bloquear o protetor de tela, mas definir o período de carência para algumas horas. (Esse é o tempo entre o início do protetor de tela e o tempo em que você precisa digitar uma senha. Geralmente, isso é definido em 5 segundos. Portanto, um agitar rápido com o mouse quando o protetor de tela simplesmente desativa o desativa. No entanto, com um valor mais alto você pode ter horas sem uma senha.
Hennes

1
O período de carência não funciona para mim, enquanto o script funciona. Presumo que minha política corporativa também desative o período de carência.
Dane Jacob Hampton

Respostas:


85

Eu uso um script que intitulo idle.vbs:

Dim objResult

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

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

A cada seis segundos, isso alterna rapidamente o numlock do teclado, fazendo com que o Windows acredite que alguém está interagindo com o teclado, impedindo o bloqueio da tela. Isso é executado em janelas de baunilha, você não precisa de ferramentas de desenvolvimento ou de script para usá-lo, basta criar um arquivo de texto com .vbs como extensão e clicar duas vezes nele (ou colocá-lo nos itens de inicialização).

Editar: você pode colocar esse script nos itens de inicialização com

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

Para obter mais informações sobre o chocoinstalador da CLI Choclatey ( ), consulte:

https://chocolatey.org/


@ JoshRivers, uma maneira de parar esse script, sem precisar reiniciar o computador, também seria bom.
DeeJayh

2
@ DeeJayh Acho que você pode encontrar a instância do wscript.exe no Gerenciador de Tarefas e matá-la. Geralmente, não existem muitas instâncias dessa execução executável. Provavelmente, você poderia criar uma solução automatizada para rescisão ( stackoverflow.com/a/22325745 ) ou colocando o código na seção Do While, que observa um fato externo. Como fazer com que o script crie um arquivo na inicialização, verifique se o arquivo existe em While. Dessa forma, você pode simplesmente excluir o arquivo para fazer o script terminar. Porém, como eu nunca desisto da tarefa, executei o script e raramente o matei com o Gerenciador de Tarefas.
JoshRivers

1
No Windows 10, uma maneira fácil de localizar a pasta de inicialização é exibir a janela Iniciar-> Executar (por exemplo, WindowsKey + R) e digite shell:startup. Veja este site para mais informações thewindowsclub.com/startup-folder-in-windows-8
buzz3791

Para encontrar o script, procure o Host de Script Baseado no Microsoft Windows no seu gerenciador de tarefas. Ou adicione uma coluna Nome do processo e procure wscript.exe.
JohnAndrews 06/06

Funciona muito bem em um laptop Win10 Surface - que nem sequer possui uma tecla física NumLock!
21418 Shahar

87

Se o Windows Media Player ainda estiver instalado, você poderá reproduzir um vídeo em loop e minimizá-lo (os vídeos de exemplo "Vida Selvagem" funcionam bem para isso). Por padrão, enquanto um vídeo estiver sendo reproduzido, a tela não será bloqueada.


3
Obrigado! Essa é a solução mais simples e eficaz. (Eu não experimentar embora, eu deixou a empresa há um tempo atrás e tentar ficar longe das janelas.)
Gabriel R.

5
Confirmo que isso funciona no Windows XP usando um arquivo MP3 em vez de um vídeo.
Alaa Ali

4
Corte brilhante!

3
Isso também funciona usando VLC para aqueles que preferem-lo sobre o Windows Media Player
eCoE

4
Funciona bem no Windows 7. Bom hack!
Neves

16

Ainda outra opção é o programa freeware Caffeine . Também é gratuito para uso comercial. Na página inicial do programa:

Se você tiver problemas com o seu PC bloqueando ou indo dormir, a cafeína o manterá acordado. Ele funciona simulando um pressionamento de tecla uma vez a cada 59 segundos, para que sua máquina pense que você ainda está trabalhando no teclado, para não bloquear a tela ou ativar o protetor de tela.

A cafeína funciona simulando um evento de tecla F15 a cada 59 segundos. De todas as teclas disponíveis, o F15 é provavelmente o menos invasivo (nunca vi um teclado de PC com essa tecla!) E o menos provável de interferir no seu trabalho.

Essa solução pronta para uso também permite controlar quando ativá-lo e desativá-lo:

Clicar duas vezes no ícone do programa esvazia a cafeteira, que é o que o ícone representa, e desativa temporariamente o programa. Clicar duas vezes nele novamente enche o pote e mantém sua máquina acordada.


8
Eu estou esperando o dia em que um empregado Gov't coloca cafeína em seu computador e isso só acontece que algo como Shift + F15 lança as armas nucleares ...
kazoni

Agradável e fácil solução "pronta para uso", obrigado. Parece ter tantas opções de linha de comando quanto o gcc, mas não preciso usar nenhuma delas!
Sam Watkins

A ferramenta funciona muito bem para mim! Eu tive que instalar o Visual C ++ 2008 Redistributable para fazê-lo funcionar. microsoft.com/en-us/download/details.aspx?id=26368
Sincronizar em

7

Você pode criar um script AutoIt para pressionar continuamente uma tecla não utilizada (por exemplo, alternar entre o num lock, o scroll lock), dormir por um minuto ou mais e repetir. Como alternativa, se você usar muito o teclado, poderá movê-lo com um pixel ou mais em qualquer direção.

Se você não deseja que ele seja executado continuamente, você também pode iniciar o script como uma tarefa agendada (se você tiver acesso) para iniciar após o computador ficar inativo por algum tempo.

E este é um script muito simples para executar um movimento invisível do mouse, se você não quiser entrar na sintaxe do AutoIt:

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

Esse script move o cursor do mouse em um pixel na direção superior esquerda e depois o retorna, depois dorme por 9 minutos ( 540000milissegundos). Quando o script está em execução, você pode ver o ícone AutoIt na bandeja. Você pode parar com o botão direito do mouse neste ícone e escolher a opção correspondente.

Para criar um script, instale o AutoIt, clique com o botão direito do mouse em qualquer pasta e escolha New> AutoIt v3 Script, nomeie-o, clique com o botão direito do mouse nesse novo script, escolha Edit, cole o código fornecido acima e salve. Você pode até compilá-lo para .exe(novamente, no menu de contexto) para iniciar, por exemplo, no Windows Scheduler.


Obrigado, eu vou dar uma olhada, parece mais simples do que uma configuração de gaiola roda do mouse :)
Gabriel R.

Versão pré-compilada do script AutoIt aqui symantec.com/connect/downloads/...
JJS

5

Compile isso no Visual Studio ou C # Express e execute-o em um prompt de comando (ou clique duas vezes nele). Requer .NET 4.0 ou superior. Faz tudo o que você está procurando.

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;


        }
    }
}

Desculpe .... no post acima tudo após a frase "Procurando". é um código e deve ser compilado. Não foi formatado corretamente. O código demonstra um pInvoke bastante interessante para os interessados. Aliás .... depois de compilado, eu apenas coloquei no meu caminho em algum lugar como c: \ windows. Dessa forma, se eu estou em um prompt cmd posso digitar ImWorkin e eu sou bom para ir :)
user205533

1
Você pode modificar sua resposta clicando no link editar abaixo.
Dennis

edite sua primeira resposta e exclua esta.
teylyn

6
O WTF está com o "Apenas um momento, estou calculando alguns valores!" loop fictício?
KalEl 24/10

6
Em resposta ao código c # postado, geralmente é habitual dar crédito ao autor. Por acaso sou eu. Postei isso há quase dois anos na pilha Overflow, acredito.


2

Eu gosto de usar opções fáceis e integradas ( sem software adicional ), como um script do PowerShell (obrigado https://dmitrysotnikov.wordpress.com/2009/06/29/prevent-desktop-lock-or-screensaver-with-powershell/ ) que usa o "f15" como a chave do sucesso (thx à cafeína. É realmente menos 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}")
}

Coloque isso em myScriptName.ps1 e inicie-o via atalho ou linha de comando da área de trabalho: C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe -nop "C:\Users\myUser\Desktop\myScriptName.ps1"

ATUALIZAÇÃO: Talvez tenha havido alguma alteração do administrador, mas isso não funciona mais para mim. Agora, tenho que usar um script de autohotkey do NBirnel: https://github.com/nbirnel/nosleep - esse trabalho é perfeito , porque move o mouse (sem distrair nenhum trabalho)


Eu executo o código, mas obtendo o seguinte erro. Por favor, informe 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 talvez você tem que definir o caminho completo para o script, então não apenas "myScriptName.ps1", mas "c: \ path \ to \ myScriptName.ps1"
eli

1

No meu caso, apenas essa linha fez o truque:

SendKeys.Send("{CAPSLOCK}");

Basta colocá-lo no Timer_Tickevento e definir o intervalo do timer para, por exemplo, 60000ms.


1
ok, é muito tarde para retomar esta resposta, mas considere enviar não uma, mas duas CAPSLOCK, se você não quiser que eu escreva GRITANDO NO MEIO DE UM STACKOVerflow comentário sem entender o porquê (levou alguns minutos para escrever esse comentário)
Gian Paolo

@GianPaolo você está certo. Foi o que eu fiz. Eu pensei que estava claro, mas talvez eu devesse modificar a resposta.
User3540753


-1

A maneira correta de lidar com isso é:

  • entre no registro em que a política está
  • defina o valor para o que quiser
  • e altere as permissões da chave do registro
  • Negar somente acesso de gravação a qualquer pessoa, exceto a você mesmo

Quando os administradores desabilitam as configurações de bloqueio de tela, a edição do registro já está desabilitada.
Gabriel R.

@GabrielR. Como administrador, você pode alterar a ACL nas chaves do Registro. Se eu tiver paciência, irei vincular a palestra de Mark Russinovish, onde ele menciona se livrar da política de grupo da Microsoft que trava seu próprio laptop. Se você é um administrador, você tem controle total da máquina. Provavelmente, você deve começar a se apropriar das chaves do registro, conceder a si mesmo controle total e negar a qualquer outra pessoa qualquer coisa, exceto o acesso de leitura.
22630 Ian

-5

Você deve desativar o "bloqueio de tela" / "modo de suspensão" no painel de controle> opções de energia> alterar as configurações do plano. Ela clique no menu suspenso para "Coloque o computador em suspensão" e selecione "nunca".


4
Os administradores de domínio podem ter um bloqueio de tela imposto pela política no Windows.
Gabriel R.
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.