Python >> Tutoriel Python >  >> Python Tag >> Windows

python, Windows 10 :lancement d'une application sur un environnement de bureau virtuel spécifique (work-spaces)

Comment puis-je dire à Python de lancer une application mais dans Desktop 2 et 3 ?

Ceci peut être réalisé en lançant vos applications avec subprocess.Popen() , puis changer de bureau virtuel en appelant GoToDesktopNumber() à partir de VirtualDesktopAccessor.dll à l'aide de ctypes , et relancez vos applications. Testé avec Windows 10 64 bits version 10.0.18363.720.

VirtualDesktopAccessor.dll par Jari Pennanen exporte les fonctions d'une partie de l'API Virtual Desktop pour la plupart non documentée (par Microsoft). Placez la dll dans le répertoire de travail courant.

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)

Le time.sleep() des appels sont nécessaires car Windows ne modifie pas instantanément les bureaux virtuels (probablement à cause des animations) et pour donner aux processus le temps de créer des fenêtres. Vous devrez peut-être modifier les horaires.

Notez que certaines applications n'autorisent qu'une seule instance/processus, vous ne pouvez donc pas obtenir plusieurs fenêtres distinctes pour chaque bureau virtuel (par exemple, Adobe Reader avec les paramètres par défaut).

Une autre stratégie que j'ai essayée consistait à lancer les applications, à dormir un peu pour permettre la création des fenêtres, puis à appeler MoveWindowToDesktopNumber() pour déplacer chaque fenêtre créée par les nouveaux processus vers différents bureaux virtuels. Le problème avec cela est que pour des applications comme Chrome ou Firefox, le nouveau processus est immédiatement fermé si un processus existant existe déjà, donc il ne déplace pas les nouvelles fenêtres (qui appartiennent en fait à un autre processus plus ancien) vers un autre bureau.

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)

TL ; DR :utiliser VDesk ?

Il semble que le support intégré pour cela dans Windows manquait il y a quelques années :

« Faites-vous référence à la fonctionnalité d'affichage des tâches "Plusieurs bureaux" dans Windows 10 ?

Si oui, veuillez noter que vous ne pouvez pas démarrer automatiquement des applications/programmes sur différents ordinateurs de bureau.

-- A. Utilisateur

Je ne connais pas d'approche python-native, mais il y a quelques réponses sur le sujet plus généralement qui suggèrent VDesk -- https://github.com/eksime/VDesk

VDesk est un programme open source gratuit pour le système d'exploitation Windows 10 qui étend la fonctionnalité de bureau virtuel d'un système.

-- MSPO

Ceci, plus les méthodes habituelles pour invoquer des programmes externes à partir de python (c'est-à-dire le module de sous-processus) devrait, espérons-le, obtenir l'effet souhaité. Bonne chance.