是否可以防止屏幕自动锁定?我以为没有办法可以覆盖策略强制设置,但是也许有一种模仿用户活动的软件。
在设置永久鼠标滚轮之前,只需询问一下。 (明白吗?)
#1 楼
另一个选择是免费的Caffeine程序。它也免费用于商业用途。从程序的主页:如果您的PC锁定或睡眠有问题,咖啡因将使它保持清醒状态。它通过每59秒模拟一次按键来工作,因此您的机器认为您仍在键盘上工作,因此不会锁定屏幕或激活屏幕保护程序。
咖啡因通过模拟F15键来工作每59秒发生一次事件。在所有可用的按键中,F15可能是侵入性最低(我从未见过使用该按键的PC键盘!),并且极不可能干扰您的工作。
搁板解决方案还允许您控制何时启用和禁用它:
双击程序图标将清空该图标所代表的咖啡壶,并暂时禁用该程序。再次双击它会重新装满锅,这将使您的机器保持清醒状态。
评论
我正在等待政府员工将咖啡因放到他们的计算机上的那一天,正好发生像Shift + F15这样的启动核武器的情况...
– kazoni
15年6月24日在17:37
非常好的简单的“现成”解决方案,谢谢。似乎具有与gcc一样多的命令行选项,但是我不需要使用任何一个!
–山姆·沃特金斯(Sam Watkins)
16-8-4在3:07
该工具对我来说很棒!我必须安装Visual C ++ 2008可再发行组件才能正常工作。 microsoft.com/en-us/download/details.aspx?id=26368
–同步
19-10-2在7:07
我认为在公司环境中,您可能(并且应该)在机器上安装此类工具时遇到麻烦,尤其是如果它不是“您的”机器。 VBS解决方案要干净得多,至少您确切知道它的作用。
– Bartosz
20年7月23日在9:14
请记住,模拟按键是防止屏幕锁定的非常残酷的方法。为了更好的方法,请检查我的答案。
–PolarBear
20 Nov 23 '19:20
#2 楼
如果仍安装Windows Media Player,则可以循环播放视频并将其最小化(示例“ Wildlife”视频可以正常工作)。默认情况下,只要播放视频,屏幕就不会锁定。评论
谢谢!这是最简单,最有效的解决方案。 (虽然我没有尝试过,但我前一段时间离开了公司,并尝试远离Windows。)
–加布里埃尔·R。
13年4月16日在11:43
我确认这在使用MP3文件而不是视频的Windows XP上有效。
– Alaa Ali
2013年9月23日上午9:59
辉煌的骇客!
–user42225
2014年4月2日在13:51
对于那些比Windows Media Player更喜欢VLC的人,也可以使用VLC
–ecoe
2014年5月5日15:22
在Windows 7中工作正常。不错!
–neves
16年11月5日,下午1:52
#3 楼
我使用标题为idle.vbs的脚本:Dim objResult
Set objShell = WScript.CreateObject("WScript.Shell")
Do While True
objResult = objShell.sendkeys("{NUMLOCK}{NUMLOCK}")
Wscript.Sleep (6000)
Loop
每六秒钟,这会快速切换键盘上的数字锁,导致Windows认为有人正在与键盘进行交互,防止屏幕锁定。它可以在普通窗口上运行,您不需要开发或脚本工具即可使用它,只需创建一个扩展名为.vbs的文本文件,然后双击它(或将其放在启动项中)即可。
编辑:您可以使用
choco install IdleVbs -source https://www.myget.org/F/joshrivers-utility/
将此脚本放入启动项中。有关Choclatey(
choco
)CLI安装程序的更多信息,请参见:https://chocolatey.org/
评论
@JoshRivers一种无需重新启动计算机即可停止此脚本的方法也不错。
–DeeJayh
17年2月3日在17:52
@DeeJayh我想您可以在任务管理器中找到wscript.exe实例并将其杀死。通常,该可执行文件没有很多实例在运行。您可能会为终止提供一个自动化的解决方案(stackoverflow.com/a/22325745),也可以将代码放在“观察时间”部分中以监视外部事实。就像脚本在启动时创建文件一样,然后检查While中是否存在该文件。这样,您可以删除文件以使脚本终止。 (不过,我从来没有放弃过,所以我只运行脚本,很少用任务管理器将其杀死)。
– JoshRivers
17年2月4日在20:28
在Windows 10上,找到启动文件夹的一种简单方法是显示``开始''->``运行''窗口(例如WindowsKey + R),然后键入shell:startup。请访问此网站了解更多信息thewindowsclub.com/startup-folder-in-windows-8
–buzz3791
18年4月12日在15:55
要查找脚本,请在任务管理器中查找“基于Microsoft Windows的脚本主机”。或添加一列“进程名称”,然后查找wscript.exe。
–约翰·安德鲁斯(JohnAndrews)
18年6月6日在8:30
在Win10 Surface笔记本电脑上非常有效-甚至没有物理NumLock钥匙!
– Shahar
18/12/19在15:45
#4 楼
您可以创建一个AutoIt脚本来连续按下一个未使用的键(例如,使其切换数字锁定,滚动锁定),睡眠一分钟左右然后重复。另外,如果您经常使用键盘,则可以使它向任意方向移动鼠标一个像素左右。如果您不希望它连续运行,也可以启动脚本作为计划的任务(如果有访问权限),在计算机不活动一段时间后启动。
这是执行不可见鼠标移动的非常简单的脚本,如果您不想进入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 Scheduler启动。评论
谢谢,我将进行检查,它似乎比鼠标滚轮笼设置简单:)
–加布里埃尔·R。
2011年8月31日上午10:37
此AutoIt脚本的预编译版本在此处symantec.com/connect/downloads/…
– JJS
16年11月29日在21:10
#5 楼
有一个名为“超时阻止程序”的android应用程序,它会每隔一段时间振动一次,您可以将鼠标放在上面。它说不要在工作中使用它。 https://play.google.com/store/apps/details?id=com.isomerprogramming.application.timeoutblocker&hl=zh-CN#6 楼
在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;
}
}
}
评论
抱歉,...在上面发布了短语“ Looking for”之后的所有内容。是代码,应进行编译。格式不正确。该代码向感兴趣的人展示了一些非常酷的pInvoke。顺便说一句....编译后,我只是将其放在我的路径中,例如c:\ windows。这样,如果我在cmd提示符下,可以键入ImWorkin,我很高兴:)
–user205533
13年3月9日,下午3:34
您可以通过单击其下方的编辑链接来修改答案。
–丹尼斯
13年9月9日在3:59
请编辑您的第一个答案,然后删除该答案。
–teylyn
13年9月9日在4:00
WTF表示“请稍等,我正在计算一些值!”虚拟循环?
– KalEl
13-10-24在13:30
作为对c#代码的响应,它发布了通常的惯例以感谢作者。碰巧是我。我相信这是两年前在堆栈溢出上发布的。
–user407607
2015年1月11日在16:59
#7 楼
这些答案很多都是古老的,只能通过输入/鼠标移动来保持生命。使用C或C ++进行编译,这将通过设置线程执行状态(当然只有Windows)使会话保持活动状态。#include <windows.h>
//https://docs.microsoft.com/en-us/windows/win32/api/winbase/nf-winbase-setthreadexecutionstate
#define ES_CONTINUOUS 0x80000000
#define ES_DISPLAY_REQUIRED 0x00000002
#define ES_SYSTEM_REQUIRED 0x00000001
int main()
{
int result = 0;
while(1)
{
result = SetThreadExecutionState(ES_SYSTEM_REQUIRED | ES_DISPLAY_REQUIRED | ES_CONTINUOUS);
Sleep(30 * 1000);
}
//unreachable
return 0;
}
评论
这些天我不再使用Windows,但这似乎很有用。
–加布里埃尔·R。
20 Mar 9 '20在15:45
我想这是int main()
–bracco23
20 Mar 11 '20 at 16:53
superuser.com/a/1596783中提供了PowerShell等效的实现。
–六角形
20-10-24在4:46
#8 楼
我喜欢使用简单且集成的选项(无需其他软件),例如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"
更新:
管理员可能进行了某些更改,但这对我而言不再起作用
现在我必须使用NBirnel提供的autohotkey脚本:https://github.com/nbirnel/nosleep-这项工作非常完美,因为它可以移动鼠标(而不会分散任何工作)
评论
我运行代码,但收到以下错误。请告知c:\ Powershell> powershell -nop myScriptName.ps1 myScriptName.ps1:术语“ myScriptName.ps1”不能识别为cmdlet,函数,脚本文件或可运行程序的名称。检查名称的拼写,或者是否包含路径,请验证路径是否正确,然后重试。在第1行:char:1 + myScriptName.ps1 + ~~~~~~~~~~~~~~~~ + + CategoryInfo:ObjectNotFound:(myScriptName.ps1:String)[],CommandNotFoundException + FullyQualifiedErrorId:CommandNotFoundException c: \ Powershell>
– Sabrina
18-11-15在13:24
@Sabrina也许您必须定义脚本的完整路径,所以不仅要定义“ myScriptName.ps1”,还要定义“ c:\ path \ to \ myScriptName.ps1”
–eli
18年11月19日在13:37
#9 楼
可以选择Mouse Jiggler:https://mousejiggler.codeplex.com/
评论
这很好用:)
– sunil
17年9月7日在11:46
#10 楼
扩展Cherona的答案,这是PowerShell中使用SetThreadExecutionState()的实现。只要脚本运行,就不会启动屏幕保护程序和屏幕锁定。
Set-StrictMode -version 3.0
# Definition of SetThreadExecutionState from -
# http://www.pinvoke.net/default.aspx/kernel32/SetThreadExecutionState.html
# https://docs.microsoft.com/en-us/windows/win32/api/winbase/nf-winbase-setthreadexecutionstate
# "EXECUTION_STATE" changed to "uint", added "public" modifier.
$Signature = @'
[DllImport("kernel32.dll", CharSet = CharSet.Auto, SetLastError = true)]
public static extern uint SetThreadExecutionState(uint esFlags);
'@
$ES_AWAYMODE_REQUIRED = 0x00000040L
$ES_CONTINUOUS = 0x80000000L
$ES_DISPLAY_REQUIRED = 0x00000002L
$ES_SYSTEM_REQUIRED = 0x00000001L
# Details on Add-Type in https://docs.microsoft.com/en-us/powershell/module/microsoft.powershell.utility/add-type?view=powershell-7.
$Kernel32 = Add-Type -MemberDefinition $Signature -Name 'Kernel32' -Namespace 'Kernel32' -PassThru
echo "Forcing system to not go to sleep (disable screen saver)."
echo "Close the window to allow sleep again."
$result = $Kernel32::SetThreadExecutionState($ES_CONTINUOUS -bor $ES_DISPLAY_REQUIRED -bor $ES_SYSTEM_REQUIRED)
# Loop until script is forcibly stopped.
While ($true) {
Start-Sleep (60 * 60 * 24) # 24 hours.
}
评论
你测试过了吗?我的印象是,您需要经常每隔一段时间调用一次SetThreadExecutionState,以重置此处描述的“系统空闲计时器”docs.microsoft.com/en-us/windows/win32/api/winbase/…
–切罗纳
20-10-24在8:10
@Cherona是的,我验证了它可以工作多个小时(锁定屏幕超时设置为1分钟)。该文档确实含糊不清,但是ES_CONTINUOUS可以解释为处理该问题。
–六角形
20-10-24在9:37
#11 楼
在我的情况下,仅用这行就可以了:SendKeys.Send("{CAPSLOCK}{CAPSLOCK}");
只需将其放在
Timer_Tick
事件中,并将计时器间隔设置为例如60000ms。评论
好的,恢复这个答案已经很晚了,但是如果您不想让我在STACKOVerflow的中间注释中大吼大叫却不明白原因,请考虑发送一个而不是两个CAPSLOCK(花了几分钟的时间写了此注释)
–吉安·保罗(Gian Paolo)
18年9月3日在8:31
@GianPaolo你是对的。这就是我所做的。我认为很清楚,但也许我应该修改答案。
–user3540753
18/09/11在7:36
回答了6年后,仍然只有一个capslock调用... smh
–enorl76
20年6月10日在17:01
如果可以将这个答案放在上下文中,那太好了...例如将其另存为脚本,在cmd中执行,...? -考虑后,其他答案提供了上下文,例如superuser.com/a/836346/183485
–关于坚果的坚果
1月4日11:14
#12 楼
我创建了一个很小的托盘图标应用程序CoffeeBean,该应用程序通过使用SetThreadExecutionState WinApi函数使用一种更好,更可靠的方式来模拟用户的活动,该函数几乎完全针对此类用例而设计(例如,视频所使用的函数)播放器,让您在观看电影时保持屏幕打开)。如果您熟悉Autohotkey,则可以使用此Autohotkey脚本。#13 楼
正确的处理方法是:进入策略所在的注册表中
将值设置为所需的任意值
并更改注册表项权限
仅拒绝对除您之外的任何人的写访问权限
评论
当管理员禁用屏幕锁定设置时,编辑注册表已被禁用。
–加布里埃尔·R。
18-10-4在15:35
@GabrielR。作为管理员,您可以更改注册表项上的ACL。如果我有耐心,我将把Mark Russinovish的演讲与他联系起来,他提到要摆脱锁定他自己的笔记本电脑的Microsoft组策略。如果您是管理员,则可以完全控制机器。它可能必须开始于获取注册表项的所有权,然后授予自己完全控制权,然后拒绝任何人(除读取访问权限外)。
–伊恩·博伊德(Ian Boyd)
18-10-4在16:43
#14 楼
您应该从控制面板>电源选项>更改计划设置中禁用“屏幕锁定” /“睡眠模式”。在下拉菜单中单击“使计算机进入睡眠状态”,然后选择“从不”。
评论
域管理员可以在Windows中具有策略强制的屏幕锁定。
–加布里埃尔·R。
13年11月18日在17:51
评论
只是好奇“荒谬可笑”是什么?15分钟。好吧,还不算太短...除非您在家,不在露天场所,而且经常在第二台计算机上工作。就像我一样,所以屏幕锁定令人讨厌。
宽限期对我不起作用,而脚本则对我不起作用。我假设我的公司政策也禁用了宽限期。
在这里玩晚了,但是想添加我的解决方案。由于我没有在工作中使用的PC的管理权限,并且该线程中的所有脚本或程序都不对我有用(或者不允许安装它们,或者就是不起作用),因此我购买了来自亚马逊的“ USB Mouse Jiggle”硬件。就像梦一样,仅售15美元。
屏幕锁定绝对需要15分钟。除了OP的辅助经验和意见外,这绝不是“荒唐的”。顺便说一句,这通常是由公司制定的,它不是IT部门制定的(我们只是强制执行或承受后果)。