python, Windows 10: запуск приложения в определенной c среде виртуального рабочего стола (рабочих пространствах) - PullRequest
6 голосов
/ 27 марта 2020

У меня есть 3 разных Windows 10 виртуальных рабочих столов. Когда компьютер запускается, я хочу, чтобы python загрузил все мои приложения на разных виртуальных рабочих столах.

Прямо сейчас я могу запускать вещи только на рабочем столе 1. Как мне сказать python, чтобы запустить приложение, но на рабочем столе 2 и 3?

Я использую python 3,6.

Ответы [ 4 ]

8 голосов
/ 29 марта 2020

TL; DR: использовать VDesk ?


Похоже, что встроенная поддержка этого в Windows отсутствовала несколько лет назад:

"Вы имеете в виду функцию просмотра задач" Несколько рабочих столов " в Windows 10?

Если да, учтите, что вы не можете автоматически запускать приложения / программы на разных рабочих столах.

- A. Пользователь

Я не знаю python родного подхода, но есть пара ответов на топи c в более общем плане, которые предполагают VDesk - https://github.com/eksime/VDesk

VDesk - бесплатная программа с открытым исходным кодом для операционной системы Windows 10, расширяющая функциональные возможности виртуального рабочего стола системы.

- MSPO

Этот плюс обычные методы вызова внешних программ из python (то есть из модуля подпроцесс ), мы надеемся получить желаемый эффект. Удачи.

7 голосов
/ 30 марта 2020

Как сказать python запустить приложение, но в Desktop 2 и 3?

Этого можно добиться, запустив приложения с subprocess.Popen(), а затем изменив виртуальный рабочий стол. позвонив по номеру GoToDesktopNumber() из VirtualDesktopAccessor.dll с помощью ctypes и снова запустив свои приложения. Протестировано с 64-битной Windows 10 версией 10.0.18363.720.

VirtualDesktopAccessor.dll от Яри Пеннанен экспортирует функции, часть которых в основном не документирована (от 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)

Требуются time.sleep() вызовы, потому что Windows не меняет виртуальные рабочие столы мгновенно (предположительно из-за анимации), и дать процессам время для создания windows. Вам может потребоваться настроить время.

Обратите внимание, что некоторые приложения допускают только один экземпляр / процесс, поэтому вы не можете получить несколько отдельных windows для каждого виртуального рабочего стола (например, Adobe Reader с настройками по умолчанию).


Еще одна стратегия, которую я попробовал, состояла в том, чтобы запустить приложения, немного поспав, чтобы можно было создать windows, затем вызвав MoveWindowToDesktopNumber(), чтобы переместить каждое окно, созданное новыми процессами, на разные виртуальные рабочие столы. Проблема в том, что для таких приложений, как Chrome или Firefox, новый процесс немедленно закрывается, если существующий процесс уже существует, поэтому он не перемещает новый windows (который фактически принадлежит другому, более старому процессу). ) на другой рабочий стол.

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)
1 голос
/ 04 апреля 2020

Обычно в Windows приложения не запускаются при запуске машины. Это было бы намного проще, если бы ОС была Linux.

0 голосов
/ 05 апреля 2020

Task Scheduler может пригодиться, если вы имеете дело с Windows OS.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...