Как сказать 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)