python,Windows 10:在特定的虚拟桌面环境(工作空间)上启动应用程序

2023-11-23

我有 3 个不同的 Windows 10 虚拟桌面。当计算机启动时,我希望 python 加载不同虚拟桌面中的所有应用程序。

现在我只能在桌面 1 中启动。我如何告诉 python 在桌面 2 和 3 中启动应用程序?

我正在使用Python 3.6。


如何告诉 python 在桌面 2 和 3 中启动应用程序?

这可以通过启动您的应用程序来实现subprocess.Popen(),然后通过调用更改虚拟桌面GoToDesktopNumber() from VirtualDesktopAccessor.dll在...的帮助下ctypes,然后再次启动您的应用程序。使用 64 位 Windows 10 版本 10.0.18363.720 进行测试。

VirtualDesktopAccessor.dll by 贾里·佩纳宁将函数导出为大多数未记录的(Microsoft)虚拟桌面 API 的一部分。放在dll在当前工作目录中。

import ctypes, time, shlex, subprocess

def launch_apps_to_virtual_desktops(command_lines, desktops=3):
    virtual_desktop_accessor = ctypes.WinDLL("VirtualDesktopAccessor.dll")
    for i in range(desktops):
        virtual_desktop_accessor.GoToDesktopNumber(i)
        time.sleep(0.25) # Wait for the desktop to switch
        for command_line in command_lines:
            if command_line:
                subprocess.Popen(shlex.split(command_line))
        time.sleep(2) # Wait for apps to open their windows
    virtual_desktop_accessor.GoToDesktopNumber(0) # Go back to the 1st desktop

command_lines = r"""
"C:\Program Files (x86)\Google\Chrome Beta\Application\chrome.exe"
"C:\Program Files (x86)\Adobe\Acrobat Reader DC\Reader\AcroRd32.exe" "C:\StudyGuide.pdf"
"C:\Program Files\Mozilla Firefox\firefox.exe"
"C:\Program Files\VideoLAN\VLC\vlc.exe"
""".splitlines()

launch_apps_to_virtual_desktops(command_lines)

The time.sleep()之所以需要调用,是因为 Windows 不会立即更改虚拟桌面(可能是因为动画),并且需要给进程时间来创建窗口。您可能需要调整时间。

请注意,某些应用程序仅允许一个实例/进程,因此您无法为每个虚拟桌面获取多个单独的窗口(例如,使用默认设置的 Adob​​e Reader)。


我尝试的另一个策略是启动应用程序,休眠一会儿以允许创建窗口,然后调用MoveWindowToDesktopNumber()将新进程创建的每个窗口移动到不同的虚拟桌面。问题是,对于像 Chrome 或 Firefox 这样的应用程序,如果现有进程已经存在,新进程会立即关闭,因此它不会将新窗口(实际上属于另一个较旧的进程)移动到另一个桌面。

import ctypes, time, shlex, subprocess
from ctypes.wintypes import *
from ctypes import windll, byref

def get_windows(pid):
    current_window = 0
    pid_local = DWORD()
    while True:
        current_window = windll.User32.FindWindowExA(0, current_window, 0, 0)
        windll.user32.GetWindowThreadProcessId(current_window, byref(pid_local))
        if pid == pid_local.value:
            yield current_window

        if current_window == 0:
            return

def launch_apps_to_virtual_desktops_by_moving(command_lines, desktops=3):
    virtual_desktop_accessor = ctypes.WinDLL("VirtualDesktopAccessor.dll")
    for i in range(desktops):
        pids = []
        for command_line in command_lines:
            if command_line:
                args = shlex.split(command_line)
                pids.append(subprocess.Popen(args).pid)

        time.sleep(3)
        for pid in pids:
            for window in get_windows(pid):
                window = HWND(window)
                virtual_desktop_accessor.MoveWindowToDesktopNumber(window, i)

command_lines = r"""
"C:\Program Files (x86)\Google\Chrome Beta\Application\chrome.exe"
"C:\Program Files (x86)\Adobe\Acrobat Reader DC\Reader\AcroRd32.exe" "C:\StudyGuide.pdf"
"C:\Program Files\Mozilla Firefox\firefox.exe"
"C:\Program Files\VideoLAN\VLC\vlc.exe"
""".splitlines()

launch_apps_to_virtual_desktops_by_moving(command_lines)
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

python,Windows 10:在特定的虚拟桌面环境(工作空间)上启动应用程序 的相关文章

随机推荐

  • 如何投影字段是否存在

    如果我有类似结构的文档如下 我正在用计算结果更新它们 我想知道结果是否已经插入到文档中 假设我对每个文档运行计算 c 和计算 d 现在我想显示所有文档的表格并显示计算 d 是否已经执行 对于这个表 我不关心计算 c id 1 a 1 res
  • 强制 JSON.NET 在序列化 DateTime 时包含毫秒(即使 ms 分量为零)

    我使用 JSON NET 直接从对象实例序列化 DateTime 值 不使用带有格式化程序的 DateTime ToString 有没有办法强制 JSON NET 在序列化中包含毫秒 即使 DateTime 的毫秒部分为零 背景 我的这个
  • 用常量列向量替换矩阵中的特定列

    对于神经网络 我想表示一个列向量y 1 2 3 在这样的矩阵中 y 1 0 0 0 1 0 0 0 1 我的矢量y非常大 因此不能选择硬编码 另外 我想避免使用for loops 到目前为止我做了什么 y1 y zeros 1 length
  • 如果您递增一个等于 STL 容器的结束迭代器的迭代器,会发生什么

    如果当迭代器指向向量的最后一个元素时将其增加 2 会怎样 在这个问题询问如何通过 2 个元素将迭代器调整为 STL 容器 提供了两种不同的方法 使用算术运算符 2 或 两次 或使用 std advance 我已经使用 VC 7 对它们进行了
  • Android 应用程序锁定相机

    是否可以获取当前在 Android 设备上锁定相机的应用程序 进程的 Android 应用程序 进程 ID 或包名称或其他 使用以下命令很容易查看它是否已锁定Camera open 但我想找出有它的过程 Thanks CameraServi
  • 如何解决 sqlite 和 c# 中的“'”问题?

    我正在使用 Sqlite 使用 Microsoft Visual C 2008 Express 我知道我的文本中的撇号 在查询中存在问题 我的问题是我认为我可以用 替换它 它似乎不起作用 这是我的代码的简化示例 string myStrin
  • 如何安全地访问 Django 模型中的请求对象

    我正在尝试做的事情 我正在尝试访问我的 django 模型中的请求对象 以便我可以使用以下命令获取当前登录的用户request user 我尝试过的 我发现了一个黑客this地点 但评论中有人指出在生产时不要这样做 我还尝试覆盖模型的 in
  • 计算预测值时发出警告

    使用数据框 x Date Val 1 1 2012 7 2 1 2012 9 3 1 2012 20 4 1 2012 24 5 1 2012 50 a lt seq as Date tail x 1 Date by month lengt
  • 序列化 Jackson JSON 树模型时排除 NullNode

    我有一个 pojo 类型 在序列化时需要将特定数值设置为特殊字符串 这些值将始终为空 可能非常深入层次结构 为了实现这一点 我首先将 pojo 转换为带有完整 null 的 JsonNode 以保留属性顺序 然后我沿着结构中的路径设置一些字
  • 验证动态添加的控件

    如何将动态添加的控件添加到验证中 div class editor field Html EditorFor model gt model Middlename div div div
  • 从 Chrome 控制台使用 Tampermonkey API?

    有什么办法使用篡改猴的 API在 Chrome 的 JavaScript 控制台中 我想搞乱像这样的功能GM xmlhttpRequest and GM listValues 创建以下脚本 UserScript name Exports s
  • Polymer:手动提交表单

    在聚合物中 我正在尝试手动提交表单 我的表格如下所示
  • 获取两个多边形相交区域的坐标(Python)

    假设我有两个多边形 它们的名称和坐标是 在 Python 中 p 1 1 2 2 4 2 3 1 q 1 5 2 3 5 5 4 3 5 1 在我们人脑中 很容易知道这两个多边形相交并计算相交区域坐标 但我想让我们的机器知道如何计算相交区域
  • 在 Unity 中显示实时摄像头源

    我有一个关于 Unity 的问题 我希望这个问题之前没有得到回答 我想将相机 如高清摄像头 连接到我的计算机 并且视频源应显示在我的 Unity 场景中 可以将其想象为虚拟电视屏幕 实时显示摄像机所看到的内容 我怎样才能做到这一点 谷歌没有
  • Facebook XMPP 聊天 API 发送消息 PHP

    我目前正在研究 Facebook Chat API 我想通过应用程序向我的 Facebook 联系人发送聊天消息 使用 facebook 提供的示例 我能够连接到 facebook 聊天服务器 但这更多的是一种反复试验的事情 我只能模糊地理
  • 在 c# 类型上切换大小写[重复]

    这个问题在这里已经有答案了 可能的重复 C 是否有比 打开类型 更好的替代方案 你好 假设我在类类型上有一个很大的 if else 有没有办法用开关盒来做到这一点 例子 function test object obj if obj is
  • 是否可以在 Android API < 24 上使用 Java 8 Stream API?

    我读过这个post这里 但我仍然无法在 minSdkVersion List
  • 如何在字符串中使用函数?

    a href 1 class bbc link new win target blank 我想使用urlencode 功能 a href urlencode 1 class bbc link new win target blank 但我不
  • 我可以在同一进程中使用同一 DLL 的两个不兼容版本吗?

    我使用的是同一供应商生产的两个商业库 称为 VendorLibA 和 VendorLibB 这些库根据编译器版本 例如 VC7 VC8 分布为多个 DLL 这两个库都依赖于该供应商生成的另一个库 称为 VendorLibUtils 并包含在
  • python,Windows 10:在特定的虚拟桌面环境(工作空间)上启动应用程序

    我有 3 个不同的 Windows 10 虚拟桌面 当计算机启动时 我希望 python 加载不同虚拟桌面中的所有应用程序 现在我只能在桌面 1 中启动 我如何告诉 python 在桌面 2 和 3 中启动应用程序 我正在使用Python