【问题标题】:Python turn screen on and off on WindowsPython在Windows上打开和关闭屏幕
【发布时间】:2022-08-09 22:18:48
【问题描述】:

直接进入问题,我试图在我的主程序中实现屏幕/显示/监视器关闭和打开功能。我研究了一下,发现this one answer 很有趣。所以,尝试测试它。简而言之,代码如下:

import time
import win32gui
import win32con

def ScreenOFF():
    \"\"\"
    Function to turn off the screen.
    \"\"\"
    return win32gui.SendMessage(win32con.HWND_BROADCAST,
                            win32con.WM_SYSCOMMAND, win32con.SC_MONITORPOWER, 2)

def ScreenON():
    \"\"\"
    Function to turn on the screen.
    \"\"\"
    return win32gui.SendMessage(win32con.HWND_BROADCAST,
                            win32con.WM_SYSCOMMAND, win32con.SC_MONITORPOWER, -1)

ScreenOFF()
time.sleep(5)
ScreenON()
time.sleep(5)

屏幕关闭工作得很好,但在执行屏幕打开功能时,屏幕只打开一秒钟,然后又立即关闭.我现在什至无法解释为什么会发生这种情况!

也尝试了这种更原始的方法,但这里也是同样的问题:

import time
import ctypes

def ScreenOFF():
    \"\"\"
    Function to turn off the screen.
    \"\"\"
    ctypes.windll.user32.SendMessageW(65535, 274, 61808, 2)

def ScreenON():
    \"\"\"
    Function to turn on the screen.
    \"\"\"
    ctypes.windll.user32.SendMessageW(65535, 274, 61808, -1)

ScreenOFF()
time.sleep(5)
ScreenON()

这里的another reference link 可能对这里有所帮助。

屏幕关闭时有 github 存储库,like this one,但屏幕上没有!

请建议我是否对此有任何修复或其他更好的方法来打开/关闭屏幕?

  • 任何暗示 HWND_BROADCAST 的答案都是不正确的。
  • 您可以将 1 作为参数传递。它适用于低功率,但它会工作。周围的大多数答案都建议伪造鼠标移动。
  • 通过 1 似乎在我的笔记本电脑上不起作用,我还尝试使用 pyautogui.move(1,1) 伪造鼠标移动,但这确实有效......
  • 如果可能的话,请投票赞成这个问题以吸引尽可能多的用户......

标签: python windows winapi screen ctypes


【解决方案1】:

尝试使用 Asyncio 而不是时间?

不确定这是否可行,但如果不行,请回复此问题,我会继续努力。

编辑: Nvm asyncio 只能与 async 一起使用。让我做一些测试。

另一个编辑: 对不起,但我无法弄清楚。也许加入 python 光盘?

【讨论】:

  • 代码示例请?
  • 我会尝试,但我的选择是有限的,因为我正在使用 replit。让我快点做这件事。还有你到底想做什么?关闭并重新打开显示器一次还是重复一次?
  • 不,我需要提到的两个单独的函数,可以在需要时随时调用......我认为不是一次。
  • 我也尝试过使用 asyncio,但没有收获!...有任何更新吗?
  • 这本来可以作为评论更好,因为这不能直接回答问题
【解决方案2】:

不是一个真正解决它一打开就打开的问题,但我找到了一种让它不会关闭的方法。

不是一个很好的方法,但它有效

import time
import ctypes
import win32api, win32con
def screen_off():
    ctypes.windll.user32.SendMessageW(65535, 274, 61808, 2)
def screen_on():
    ctypes.windll.user32.SendMessageW(65535, 274, 61808, -1)
    move_cursor()
def move_cursor():
    x, y = (0,0)
    win32api.mouse_event(win32con.MOUSEEVENTF_MOVE, x, y)

screen_off()
time.sleep(3)
screen_on()

如果您移动光标或键入某些内容,屏幕将保持打开状态,所以

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-03-17
    • 1970-01-01
    • 2014-10-30
    • 1970-01-01
    相关资源
    最近更新 更多