Saltar al contenido

python, Windows 10: iniciar una aplicación en un entorno de escritorio virtual específico (espacios de trabajo)

Esta duda se puede resolver de diversas formas, pero te damos la respuesta más completa para nosotros.

Solución:

¿Cómo le digo a Python que inicie una aplicación pero en el Escritorio 2 y 3?

Esto se puede lograr iniciando sus aplicaciones con subprocess.Popen(), luego cambia el escritorio virtual llamando GoToDesktopNumber() desde VirtualDesktopAccessor.dll con la ayuda de ctypese iniciando sus aplicaciones nuevamente. Probado con Windows 10 de 64 bits, versión 10.0.18363.720.

VirtualDesktopAccessor.dll por Jari Pennanen exporta las funciones como parte de la API de escritorio virtual, en su mayoría indocumentada (por Microsoft). Coloque la dll en el directorio de trabajo actual.

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)GoogleChrome BetaApplicationchrome.exe"
"C:Program Files (x86)AdobeAcrobat Reader DCReaderAcroRd32.exe" "C:StudyGuide.pdf"
"C:Program FilesMozilla Firefoxfirefox.exe"
"C:Program FilesVideoLANVLCvlc.exe"
""".splitlines()

launch_apps_to_virtual_desktops(command_lines)

El time.sleep() se necesitan llamadas porque Windows no cambia los escritorios virtuales instantáneamente (presumiblemente debido a las animaciones) y para dar tiempo a los procesos para crear ventanas. Es posible que deba modificar los tiempos.

Tenga en cuenta que algunas aplicaciones solo permiten una instancia / proceso, por lo que no puede obtener varias ventanas independientes para cada escritorio virtual (por ejemplo, Adobe Reader con la configuración predeterminada).


Otra estrategia que probé fue iniciar las aplicaciones, dormir un poco para permitir que se crearan las ventanas y luego llamar MoveWindowToDesktopNumber() para mover cada ventana creada por los nuevos procesos a diferentes escritorios virtuales. El problema con eso es que, para aplicaciones como Chrome o Firefox, el nuevo proceso se cierra inmediatamente si ya existe un proceso existente, por lo que no mueve las nuevas ventanas (que en realidad pertenecen a otro proceso más antiguo) a otro escritorio.

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)GoogleChrome BetaApplicationchrome.exe"
"C:Program Files (x86)AdobeAcrobat Reader DCReaderAcroRd32.exe" "C:StudyGuide.pdf"
"C:Program FilesMozilla Firefoxfirefox.exe"
"C:Program FilesVideoLANVLCvlc.exe"
""".splitlines()

launch_apps_to_virtual_desktops_by_moving(command_lines)

TL; DR: ¿usa VDesk?


Parece que hace unos años faltaba soporte integrado para esto en Windows:

“¿Se refiere a la función de vista de tareas” Varios escritorios “en Windows 10?

En caso afirmativo, tenga en cuenta que no puede hacer que las aplicaciones / programas se inicien automáticamente en diferentes escritorios.

— Un usuario

No conozco un enfoque nativo de Python, pero hay un par de respuestas sobre el tema de manera más general que sugieren VDesk – https://github.com/eksime/VDesk

VDesk es un programa gratuito de código abierto para el sistema operativo Windows 10 que amplía la funcionalidad de escritorio virtual de un sistema.

– MSPO

Esto más los métodos habituales para invocar programas externos desde Python (es decir, el módulo de subproceso) deberían obtener el efecto deseado. Buena suerte.

Comentarios y valoraciones del tutorial

Si haces scroll puedes encontrar las aclaraciones de otros gestores de proyectos, tú además puedes dejar el tuyo si lo deseas.

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *