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 ctypes
e 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.