首页 > 编程问答 >使用 WSL 时截取 Windows 桌面的屏幕截图

使用 WSL 时截取 Windows 桌面的屏幕截图

时间:2024-07-22 05:19:52浏览次数:14  
标签:python screenshot windows-subsystem-for-linux monitor

我主要使用 Windows,其中运行 WSL2。因此,从子系统中运行的 python 脚本中,我想截取 Windows 监视器上的所有内容,就像这样简单:

v1

import mss
import os

os.environ['DISPLAY'] = ':0'

with mss.mss() as sct:
    sct.shot()

这只会给出“分段错误”错误并且没有图像。因此,我尝试在 Windows 中设置 vcxsrv,并且可以通过服务器从 Windows 中的子系统打开内容,但是我无法以相反的方式获得它..

我只想访问 Windows 屏幕,这样我就可以截图它。任何有关如何通过 wsl 访问监视器的帮助将不胜感激,我在谷歌上找不到太多。


很不幸,你不能直接用 mss 库从 WSL 发起截屏 Windows 桌面的操作。这是因为 mss 依赖于与显示服务器的直接连接来捕捉屏幕内容,而 WSL 环境与 Windows 显示服务器运行在不同的内核和图形堆栈上。

为了实现你的目标,你可以考虑以下几种方法:

1. 使用 Windows 上运行的截图工具,并通过 WSL 调用:

  • 你可以使用 Python 的 subprocess 模块从 WSL 中调用 Windows 上的截图工具,例如:
    • Snipping Tool: subprocess.run(["snippingtool", "/clip"]) 将截取屏幕并保存到剪贴板。
    • ShareX: 安装 ShareX 并使用命令行选项来自定义截图操作。
  • 你需要找到适合你需求的 Windows 截图工具,并参考其文档了解如何通过命令行使用。

2. 使用网络传输截图数据:

  • 你可以编写一个简单的 Python 脚本,使用 Windows 上的截图库(例如 pyautogui Pillow )截取屏幕,并将图像数据通过网络发送到 WSL。
  • 在 WSL 中,你可以使用 Python 的 socket 模块接收图像数据并保存为文件。

3. 使用远程桌面协议 (RDP) 库:

  • 你可以使用 Python 的 RDP 库(例如 rdp mrdp )连接到 Windows 并截取远程桌面会话的屏幕截图。
  • 这种方法需要你在 Windows 上启用远程桌面连接。

以下是一个使用 pyautogui 在 Windows 上截屏并将图像数据通过网络发送到 WSL 的示例:

Windows 端 (server.py):

import socket
import pyautogui

HOST = '127.0.0.1'  # 你的 WSL IP 地址
PORT = 65432        

with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as s:
    s.bind((HOST, PORT))
    s.listen()
    conn, addr = s.accept()
    with conn:
        print(f"Connected by {addr}")
        screenshot = pyautogui.screenshot()
        screenshot.save("screenshot.png")
        with open("screenshot.png", "rb") as f:
            data = f.read()
            conn.sendall(data)

WSL 端 (client.py):

import socket

HOST = '127.0.0.1'  # Windows 的 IP 地址
PORT = 65432        

with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as s:
    s.connect((HOST, PORT))
    with open("received_screenshot.png", "wb") as f:
        while True:
            data = s.recv(1024)
            if not data:
                break
            f.write(data)

print("Screenshot received successfully!")

请根据你的实际情况选择最合适的方法。

标签:python,screenshot,windows-subsystem-for-linux,monitor
From: 71087163

相关文章

  • 在Spyder(Python 3.6)中导入cv2时出现导入错误
    我已经在Windows操作系统中安装了opencv3.0.0。我已运行该应用程序并已成功将其安装在C:\驱动器中,并且还将cv2.pyd文件复制到C:\Python27\Lib\site-packages中,正如我在几个教程视频中看到的那样在我的Python2.7.5Shell中,即当我键入>>>i......
  • Python + VS Code 调试器:可视化我的程序当前正在执行的源代码中的位置?
    当我使用VSCodePython调试器时:我可以执行我的程序,以便编辑器将我逐行带到源代码中的任何位置(跳转到相关文件/如果尚未打开则将其打开)目前的执行情况是?是的,VSCode的Python调试器可以让你逐行执行代码,并实时显示当前执行的位置。以下是操作方法:1.设置断点:......
  • 如何立即取消使用 Ollama Python 库生成答案的 Asyncio 任务?
    我正在使用Ollama通过OllamaPythonAPI从大型语言模型(LLM)生成答案。我想通过单击停止按钮取消响应生成。问题在于,只有当响应生成已经开始打印时,任务取消才会起作用。如果任务仍在处理并准备打印,则取消不起作用,并且无论如何都会打印响应。更具体地说,即使单击按钮后,此函数......
  • 使用 np.array 索引过滤 Python 列表
    谁能向我解释一下列表self.data如何使用numpy索引数组selec_idx进行索引/过滤?完整的课程可在https://github.com/kaidic/LDAM-DRW/blob/master/imbalance_cifar.pydefgen_imbalanced_data(self,img_num_per_cls):new_data=[]n......
  • 尝试在cmd(python)中安装turtle
    当我在cmd中编写pipinstallturtle后,这条消息出现在我面前。有人知道该怎么办吗?C:\>pipinstallturtleCollectingturtleUsingcachedturtle-0.0.2.tar.gz(11kB)ERROR:Commanderroredoutwithexitstatus1:command:'C:\Users\Bruger\App......
  • Python + Polars:如何有效地“fill_null”仅 DataFrame 的某些列?
    例如,假设我只想fill_null(strategy="zero")DataFrame的数字列。我当前的策略是这样做:final_df=df.select(cs.exclude(cs.numeric()))final_df.with_columns(df.select(cs.numeric()).fill_null(strategy="zero"))是否有替代的、更惯用或更有效的方法来实现我......
  • 如何找到 Windows 上 Python 的安装位置?
    我想找出我的Python在Windows上的安装路径。例如:C:\Python25如何找到Python的安装位置?在Windows上查找Python安装位置的方法有很多种:1.使用where命令(推荐方法):打开命令提示符(cmd)。输入以下命令并按回车键:wherepython......
  • Python Pandas:如何解析没有行结尾的 CSV
    如何解析没有行结尾的CSV文件?示例数据sep=;Id;Date;1;1980-02-29;2;1980-03-10;3;;可以使用lineterminator参数指定行终止符来解析没有行尾的CSV文件。在这种情况下,你可以将lineterminator设置为一个空字符串('')。以下是使用......
  • Python 中的 azure.ai.translation.document - 无法使用当前权限访问源文档位置
    我在使用Python中的azure.ai.translation.document库时遇到问题。我已经在Azure中设置了翻译服务以及带有两个容器的Blob存储。我已使用“用户委托密钥”创建了SAS连接。一种用于源(读取/列表),一种用于目标(写入/列表)。例如我尝试运行Python程序,但源b......
  • 博文标题:探索Python中的元编程:装饰器的魔法
    引言在Python的世界里,装饰器(Decorators)是一种非常强大的特性,它允许程序员在不修改原始函数代码的情况下,为函数添加新的功能。这种机制不仅增强了代码的可读性和可维护性,还提供了高度的灵活性和扩展性。本文将深入探讨装饰器的基本概念、工作原理以及如何利用它们来简化和......