玩游戏杆时防止Windows屏幕锁定


12

我的Windows 7系统设置为在闲置20分钟后锁定屏幕(这是工作场所强制执行的策略;我无法更改此设置)。

当我使用键盘/鼠标时,Windows将它们视为用户输入,因此屏幕保持解锁状态。但是,当我仅使用操纵杆玩任何游戏时,Windows会将其视为没有活动,因此在超时后屏幕将被锁定。

在使用基于操纵杆的游戏时,是否可以防止屏幕锁定?

作为一种解决方法,我目前正在使用VLC在后台播放一些随机视频(静音),以防止屏幕锁定。但是应该有更好的方法来解决这个问题...

我可能会写一个脚本,该脚本将模拟一些按键,例如{NUMLOCK}{NUMLOCK}via sendkeys。但是,总有可能会产生意想不到的副作用,例如阻止我在游戏选项中使用这些键。


是的,可以按照您建议的方式实现。但是您是否检查了是否可以切换电源计划?(而不是更改电源计划设置。)有时,高性能电源计划禁用了节能功能。而且:如果他们锁定了您的电源计划设置,是否让他们没有安装或运行未经管理员授权的软件的能力?
miroxlav

“有时高性能电源计划已禁用节能功能”是个好主意。但是,此设置是在屏幕保护程序设置(而非电源计划设置)中作为策略强制执行的。“他们没有释放安装或运行未经管理员授权的软件的能力吗?”通常,是的,但是这些软件不能更改策略强制执行的设置。
anishsane

是否有人知道任何Windows API,以防止屏幕锁定(在播放视频时像VLC这样的媒体播放器使用的屏幕锁定)?
anishsane

Answers:


1

每当您按键盘上的某个键或移动/单击鼠标时,Windows都会重置其空闲计时器。您可以调用Windows API函数,以完全相同的方式重置空闲计时器。通过定期调用该功能,屏幕保护程序将永远不会激活,计算机也将永远不会锁定。这就是VLC和其他应用程序所做的。

函数名称为SetThreadExecutionState,可在中找到kernel32.dll。在VB中,实际的调用如下所示:

SetThreadExecutionState(ES_SYSTEM_REQUIRED Or ES_DISPLAY_REQUIRED)

这两个常数是:

ES_SYSTEM_REQUIRED = &H1ES_DISPLAY_REQUIRED = &H2

您无法通过VBScript进行这些调用,因此需要使用更高级的代码进行编码。

顺便说一句,以上是执行此操作的技术上正确的方法。我在网上看到的许多实用程序都使用了愚蠢的技巧,例如模拟击键或摇动鼠标。我认为这很糟糕,因为它可能会干扰您的工作。

无论如何,我离题太多了。这种东西属于堆栈溢出。


0

您可以使用SetThreadExecutionStatePython的ctypes模块提供的函数,作为独立的Python应用程序的一部分,您可以在后台运行并使用Ctrl + C退出。(感谢@ misha256的回答,解释了此功能的使用!)

import ctypes
from time import sleep

ES_CONTINUOUS        = 0x80000000
ES_SYSTEM_REQUIRED   = 0x00000001

# CONTINUOUS repeats the action until the application closes,
# SYSTEM_REQUIRED 'forces the system to be in the working state by resetting the system idle timer.'
ctypes.windll.kernel32.SetThreadExecutionState(ES_CONTINUOUS | ES_SYSTEM_REQUIRED)

# wait until broken
while True:
    # attempt to run the following code
    try:
        sleep(1) # thanks @anishsane
    except(KeyboardInterrupt): # catch a Ctrl+C
        break # stop waiting

我已经为Windows构建了该脚本。在此处访问GitHub发布页面。


1
代替0占位符,标准方法是pass
anishsane

1
同样,最好保留一些sleep()而不是pass。否则,这将忙于等待并消耗CPU。您甚至可以在那里睡几个小时。
anishsane

0

只需运行一个名为:的文件no_sleep.vbs。该文本文件no_sleep.vbs应包含以下文本内容。
如果不知道如何创建空白文本文件并重命名其扩展名,请使用google。

set wsc = CreateObject("WScript.Shell")
Do
   'Five minutes
    WScript.Sleep(5*60*1000)
    wsc.SendKeys("{F13}")
Loop

键F13不应干扰游戏选项


嗯 可以的。
anishsane
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.