如何用Python唤醒休眠显示器以显示Tkinter告警弹窗?
在Win10下用Python唤醒休眠显示器并恢复Tkinter告警弹窗
要解决Win10休眠后Tkinter弹窗无法唤醒显示器的问题,需要通过系统级API触发用户活动事件,让系统识别到操作发生,从而唤醒显示器并重置休眠倒计时。以下是两种可行的实现方式:
方法1:模拟键盘按键事件(和Caffeine64原理一致)
通过模拟F15按键的按下/抬起操作,触发系统的用户活动检测,唤醒显示器并重置休眠倒计时。需要用到pywin32库调用Windows API:
- 先安装依赖:
pip install pywin32
- 实现唤醒函数:
import win32api import win32con def wake_up_display(): # 模拟F15按键按下 win32api.keybd_event(win32con.VK_F15, 0, 0, 0) # 模拟F15按键抬起 win32api.keybd_event(win32con.VK_F15, 0, win32con.KEYEVENTF_KEYUP, 0)
- 在TCP包触发逻辑中调用:
# 收到TCP包时的处理流程 wake_up_display() g.deiconify() g.attributes('-topmost', True) g.focus_force()
方法2:调用系统电源管理API临时激活系统
通过SetThreadExecutionState函数临时设置系统为活跃状态,唤醒显示器后再恢复默认状态,让系统继续正常的休眠逻辑:
import win32api import win32con import time def wake_up_display(): # 标记系统需要保持活跃,唤醒显示器 active_state = win32con.ES_DISPLAY_REQUIRED | win32con.ES_SYSTEM_REQUIRED win32api.SetThreadExecutionState(active_state) # 短暂延迟确保显示器唤醒 time.sleep(0.1) # 恢复系统默认状态,允许后续正常休眠 win32api.SetThreadExecutionState(win32con.ES_CONTINUOUS)
为什么之前的Tkinter操作无效?
g.attributes('-topmost', True)和g.focus_force()仅针对窗口层级和焦点进行操作,不会触发Windows的用户活动检测机制,因此无法唤醒处于休眠状态的显示器。
注意事项
- 测试时确保显示器进入的是休眠状态而非屏幕保护程序
- 如果F15按键无效,可替换为其他不常用按键(如
win32con.VK_SCROLL)或模拟鼠标移动事件 - 无需管理员权限即可运行上述代码
内容的提问来源于stack exchange,提问作者isidore
相关产品推荐
相关产品推荐

