鱼C论坛

 找回密码
 立即注册
查看: 3173|回复: 6

[已解决]pyautogui防止屏幕息屏问题

[复制链接]
发表于 2022-5-11 19:53:09 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
pyautogui可以控制鼠标移动,希望可以通过设置每1分钟移动一下鼠标,防止屏幕锁屏
但实际操作下来,通过使用pyautogui.move()函数,可以实现鼠标移动,但是屏幕到时间了依然会锁屏!
求助!如何操作可以实现防止息屏?
最佳答案
2022-5-12 02:35:19
本帖最后由 hrpzcf 于 2022-5-12 02:45 编辑
流浪诗人12345 发表于 2022-5-12 00:13
pyautogui.press()可以的,但主要是按键害怕影响程序运行,所以我先尝试了直接手动移动鼠标,是可以避免 ...


那就调用系统 API,只要这个脚本不结束,系统就不会息屏和睡眠(除非被别的程序动了睡眠策略)。
time.sleep() 时间可以设置的长些,比你设置的息屏时间或者睡眠时间(两者中最小者)短几分钟就行。
import time
from ctypes import windll, c_uint

KERNEL = windll.kernel32
KERNEL.SetThreadExecutionState.restype = c_uint
KERNEL.SetThreadExecutionState.argtypes = (c_uint,)
RESTORE = 0x80000000
PREVENT = 0x00000001 | 0x00000002 | 0x80000000


def alive():
    """阻止系统息屏和睡眠"""
    return hex(KERNEL.SetThreadExecutionState(PREVENT))


def restore():
    """恢复息屏和睡眠策略"""
    return hex(KERNEL.SetThreadExecutionState(RESTORE))


# 调用 alive 阻止息屏睡眠,调用 restore 恢复
# 本脚本运行后,在此脚本的控制台可以 Ctrl + C 结束运行
try:
    print("开启状态:", alive())
    start = time.time()
    while True:
        now = time.time()
        print(f"经历时长:{now - start:.0f}")
        time.sleep(1)
except KeyboardInterrupt:
    print("已手动恢复息屏及睡眠。")
finally:
    print("恢复状态:", restore())
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2022-5-11 23:31:02 | 显示全部楼层
自动按键应该可以阻止锁屏。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2022-5-12 00:11:38 | 显示全部楼层
hrpzcf 发表于 2022-5-11 23:31
自动按键应该可以阻止锁屏。

pyautogui.press()可以的
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2022-5-12 00:13:23 | 显示全部楼层
hrpzcf 发表于 2022-5-11 23:31
自动按键应该可以阻止锁屏。

pyautogui.press()可以的,但主要是按键害怕影响程序运行,所以我先尝试了直接手动移动鼠标,是可以避免息屏的,但用pyautogui移动鼠标指针时,到时间了还是息屏,感觉两个不应该时一样的吗?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-5-12 02:35:19 | 显示全部楼层    本楼为最佳答案   
本帖最后由 hrpzcf 于 2022-5-12 02:45 编辑
流浪诗人12345 发表于 2022-5-12 00:13
pyautogui.press()可以的,但主要是按键害怕影响程序运行,所以我先尝试了直接手动移动鼠标,是可以避免 ...


那就调用系统 API,只要这个脚本不结束,系统就不会息屏和睡眠(除非被别的程序动了睡眠策略)。
time.sleep() 时间可以设置的长些,比你设置的息屏时间或者睡眠时间(两者中最小者)短几分钟就行。
import time
from ctypes import windll, c_uint

KERNEL = windll.kernel32
KERNEL.SetThreadExecutionState.restype = c_uint
KERNEL.SetThreadExecutionState.argtypes = (c_uint,)
RESTORE = 0x80000000
PREVENT = 0x00000001 | 0x00000002 | 0x80000000


def alive():
    """阻止系统息屏和睡眠"""
    return hex(KERNEL.SetThreadExecutionState(PREVENT))


def restore():
    """恢复息屏和睡眠策略"""
    return hex(KERNEL.SetThreadExecutionState(RESTORE))


# 调用 alive 阻止息屏睡眠,调用 restore 恢复
# 本脚本运行后,在此脚本的控制台可以 Ctrl + C 结束运行
try:
    print("开启状态:", alive())
    start = time.time()
    while True:
        now = time.time()
        print(f"经历时长:{now - start:.0f}")
        time.sleep(1)
except KeyboardInterrupt:
    print("已手动恢复息屏及睡眠。")
finally:
    print("恢复状态:", restore())
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2022-5-12 10:40:05 | 显示全部楼层
hrpzcf 发表于 2022-5-12 02:35
那就调用系统 API,只要这个脚本不结束,系统就不会息屏和睡眠(除非被别的程序动了睡眠策略)。
time ...

感谢大佬!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-5-12 11:02:17 | 显示全部楼层

不客气,昨晚太困了写的是蒙圈版(虽然也能达到效果)
这个是修正版,别的程序作妖把息屏睡眠恢复默认了也不会息屏。
import time
from ctypes import windll, c_uint

KERNEL = windll.kernel32
KERNEL.SetThreadExecutionState.restype = c_uint
KERNEL.SetThreadExecutionState.argtypes = (c_uint,)
RESTORE = 0x80000000
PREVENT = 0x00000001 | 0x00000002 | 0x80000000


def alive():
    """阻止系统息屏和睡眠"""
    return hex(KERNEL.SetThreadExecutionState(PREVENT))


def restore():
    """恢复息屏和睡眠策略"""
    return hex(KERNEL.SetThreadExecutionState(RESTORE))


# 调用 alive 阻止息屏睡眠,调用 restore 恢复
# 本脚本运行后,在此脚本的控制台可以 Ctrl + C 结束运行
try:
    while True:
        print("开启状态:", alive())
        # 如果系统设置的息屏或睡眠时间是10分钟(600秒),那这里就设置大概500秒左右
        time.sleep(500)
except KeyboardInterrupt:
    print("已手动恢复息屏及睡眠。")
finally:
    print("恢复状态:", restore())
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-11-18 08:25

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表