python实现防止windows自动锁屏

起因

因为公司内部用软件限制了锁屏时间,调整注册表、修改组策略、修改屏保啥的都试了,电脑该锁屏还是锁屏,经常在堡垒机执行一个长一点的命令的时候,上个厕所功夫回来就锁屏了,再解锁,堡垒机就断开连接了。严重打扰工作效率,所以使用python定时向windows的API发送请求来防止锁屏。

优点

相比使用鼠标定时连点、或者触发键盘按键的方式,此方法不影响任何操作。

功能

1. 默认200秒执行一次,可以根据自己的锁屏时间调整,比锁屏时间提前一些就行。

2. 有开始和停止按钮

3. 点击开始或右上角叉号后会自动最小化到托盘,不占用开始任务拦,退出时直接在托盘点右键-退出即可。

参考

向windows发送API参考了下面链接中“hrpzcf”的回复。

开始与下面论坛中提问的问题一样,想用移动鼠标实现,发现程序控制,移动鼠标不能防止自动锁屏,下面就找到了大神的解决方法。
pyautogui防止屏幕息屏问题,Python交流,技术交流,鱼C论坛 - Powered by Discuz! (fishc.com.cn)icon-default.png?t=N7T8https://fishc.com.cn/thread-213259-1-1.html

 完整代码

 python版本:3.11

 第三方包:PyQt5、pyInstaller

import sys
import os
from PyQt5.QtWidgets import (QApplication, QMainWindow, QPushButton, QLabel, QLineEdit,
                             QSystemTrayIcon, QAction, QMenu)
from PyQt5.QtGui import QIcon
from PyQt5.QtCore import Qt, QTimer
from ctypes import windll, c_uint


class MyWindow(QMainWindow):
    def __init__(self):
        super().__init__()

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

        self.sleepTime = 200  # 默认为200秒
        self.isRunning = False

        self.initUI()

    def initUI(self):
        self.setWindowTitle("noLockScreen")  # 设置窗口标题
        self.setWindowFlags(Qt.WindowStaysOnTopHint | Qt.Tool)  # 设置窗口标志

        self.setGeometry(0, 0, 300, 150)
        self.centerOnScreen()

        self.label = QLabel('时间(秒):', self)
        self.label.setGeometry(30, 20, 150, 20)

        self.lineEdit = QLineEdit(self)
        self.lineEdit.setGeometry(160, 20, 100, 20)
        self.lineEdit.setText(str(self.sleepTime))  # 设置默认值为200秒

        self.button = QPushButton('开始', self)
        self.button.setGeometry(30, 80, 100, 40)
        self.button.clicked.connect(self.onButtonClick)

        self.tray_icon = QSystemTrayIcon(self)
        icon_path = os.path.join(os.path.dirname(os.path.abspath(__file__)), 'icon.png')
        self.tray_icon.setIcon(QIcon(icon_path))

        # 设置系统托盘图标的菜单
        self.tray_menu = QMenu(self)
        self.restore_action = QAction("恢复", self)
        self.restore_action.triggered.connect(self.showNormal)
        self.tray_menu.addAction(self.restore_action)
        self.minimize_action = QAction("最小化", self)
        self.minimize_action.triggered.connect(self.hide)
        self.tray_menu.addAction(self.minimize_action)
        self.quit_action = QAction("退出", self)
        self.quit_action.triggered.connect(self.quitApp)
        self.tray_menu.addAction(self.quit_action)
        self.tray_icon.setContextMenu(self.tray_menu)

        # 设置系统托盘图标的响应行为
        self.tray_icon.activated.connect(self.trayIconActivated)
        self.tray_icon.show()

        # 设置定时器
        self.timer = QTimer(self)
        self.timer.timeout.connect(self.preventSleep)

    def centerOnScreen(self):
        # 将窗口居中显示
        screen_geometry = QApplication.desktop().screenGeometry()
        x = (screen_geometry.width() - self.width()) // 2
        y = (screen_geometry.height() - self.height()) // 2
        self.move(x, y)

    def onButtonClick(self):
        # 触发开始/停止按钮
        if not self.isRunning:
            self.isRunning = True
            self.button.setText('停止')
            self.startTimer()
            self.hide()
        else:
            self.isRunning = False
            self.button.setText('开始')
            self.stopTimer()

    def startTimer(self):
        # 开始定时器
        interval = int(self.lineEdit.text())
        self.timer.start(interval * 1000)  # 将秒转换为毫秒

    def stopTimer(self):
        # 停止定时器
        self.timer.stop()

    def preventSleep(self):
        # 防止计算机进入睡眠模式
        self.KERNEL.SetThreadExecutionState(self.PREVENT)

    def quitApp(self):
        # 退出应用
        self.timer.stop()
        QApplication.quit()

    def trayIconActivated(self, reason):
        # 系统托盘图标被激活时的行为
        if reason == QSystemTrayIcon.DoubleClick:
            self.showNormal()

    def closeEvent(self, event):
        # 关闭事件,当窗口关闭时将事件忽略,而是隐藏窗口,除非系统托盘图标不可见
        if self.tray_icon.isVisible():
            event.ignore()
            self.hide()
        else:
            event.accept()


if __name__ == '__main__':
    app = QApplication(sys.argv)

    mywindow = MyWindow()
    mywindow.show()

    sys.exit(app.exec_())

打包

pyinstaller --add-data "icon.png;." -F -i icon.ico script.py --noconsole

script.py是我的代码文件

icon.png是程序启动后显示的图标

-i icon.ico是用于指定程序的图标

--noconsole 运行时不显示控制台

-F 参数解释:

当指明 -F参数构建时,程序被解压缩到一个临时目录并从那里运行。第二个进程是实际的程序,而第一个进程是在程序退出或崩溃后清理临时目录

因此, 去除 -F参数时, 就可以显示一个进程, 但是如果只有一个进程,那么在崩溃的情况下就无法清理临时目录。

图标文件与script.py文件在一个目录下,打包完成后生成build和dist两个目录,运行dist下面的.exe执行文件即可。

  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
要使用Python实现解锁Win10锁屏,你可以按照以下步骤进行操作: 1. 打开文件资源管理器,导航到以下路径:C:\Users\\[用户名\]\AppData\Local\Packages\Microsoft.Windows.ContentDeliveryManager_cw5n1h2txyewy\LocalState\Assets。这是存储锁屏壁纸的文件夹。 2. 复制该文件夹的路径,以便在Python代码中使用。 3. 使用Python的shutil模块来复制文件。你可以使用以下代码: ```python import os import shutil # 设置源文件夹路径 src_folder = r'C:\Users\\[用户名\]\AppData\Local\Packages\Microsoft.Windows.ContentDeliveryManager_cw5n1h2txyewy\LocalState\Assets' # 设置目标文件夹路径 dst_folder = r'C:\目标文件夹路径' # 遍历源文件夹中的文件 for filename in os.listdir(src_folder): # 构建源文件的完整路径 src_file = os.path.join(src_folder, filename) # 构建目标文件的完整路径,并添加.jpg扩展名 dst_file = os.path.join(dst_folder, filename + '.jpg') # 复制文件 shutil.copy(src_file, dst_file) ``` 请确保将`\[用户名\]`替换为你的用户名,并将`C:\目标文件夹路径`替换为你想要保存解锁壁纸的目标文件夹路径。 4. 运行上述代码,它将复制锁屏壁纸文件夹中的所有文件到指定的目标文件夹,并为每个文件添加.jpg扩展名。 现在,你可以在目标文件夹中找到解锁壁纸的副本,并且可以预览它们了。 #### 引用[.reference_title] - *1* *3* [实战 | Python批量提取Win10锁屏壁纸](https://blog.csdn.net/weixin_35837926/article/details/113515844)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control,239^v3^insert_chatgpt"}} ] [.reference_item] - *2* [用python获取win10锁屏图片](https://blog.csdn.net/weixin_39806388/article/details/111848469)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值