Windows 10 Virtual Desktop Management
- callback notifications
 
- comtypes
 - six
 
python setup.py install
python setup.py build
This is still a work in progress. But the basic use is as follows.
from __future__ import print_function
import pyWinVirtualDesktop
for desktop in pyWinVirtualDesktop:
    print('DESKTOP ID:', desktop.id)
    print('DESKTOP TO LEFT:', desktop.desktop_to_left.id)
    print('DESKTOP TO RIGHT:', desktop.desktop_to_right.id)
    print('DESKTOP IS ACTIVE:', desktop.is_active)
    print('DESKTOP WINDOWS:')
    for window in desktop:
        print('    HANDLE:', window.id)
        print('    CAPTION:', window.text)
        print('    PROCESS NAME:', window.process_name)
        print('    ON ACTIVE DESKTOP:', window.is_on_active_desktop)
        print('\n')- 
Properties
- desktop_ids: a list of all of the desktop ids
 
 - 
Functions
- create_desktop: creates a new desktop and returns a Desktop instance
 
 
- 
Properties
- id: returns comtypes.GUID instance
 - desktop_to_left: return Desktop instance
 - desktop_to_right: return Desktop instance
 - is_active: return 
True/False 
 - 
Methods
- add_window(window): adds a window to the desktop, window can be wither a window handle or a Window class instance
 - add_view:(view): under construction
 - delete():: deletes the window
 
 
- 
Properties
- id: window handle
 - text: window caption
 - is_ok: if the window is still valid
 - desktop: Desktop instance the window is on
 - process_name: the executable name
 - is_on_active_desktop: if the windows is on the desktop that is being viewed
 
 - 
Methods
- move_to_desktop(desktop): move the window to a new desktop. desktop can be either the desktop id or a Desktop instance
 
 
In order to register for notifications you need to either create a
subclass or an instance of pyWinVirtualDesktop.DesktopNotificationCallback
and override several methods.
create(new)change(old, new)destroy_begin(destroyed, fallback)destroy_failed(destroyed, fallback)destroy(destroyed, fallback)
There are 2 ways this can be done. It's easier to explain through the use of code.
import pyWinVirtualDesktop
class NotificationCallback(pyWinVirtualDesktop.DesktopNotificationCallback):
    def create(self, new):
        pass
    def change(self, old, new):
        pass
    def destroy_begin(self, destroyed, fallback):
        pass
    def destroy_failed(self, destroyed, fallback):
        pass
    def destroy(self, destroyed, fallback):
        pass
cookie = pyWinVirtualDesktop.register_notification_callback(NotificationCallback)you can also pass an instance of the subclass if you like.
callback = NotificationCallback()
cookie = pyWinVirtualDesktop.register_notification_callback(callback)import pyWinVirtualDesktop
def create(new):
    pass
def change(old, new):
    pass
def destroy_begin(destroyed, fallback):
    pass
def destroy_failed(destroyed, fallback):
    pass
def destroy(destroyed, fallback):
    pass
callback = pyWinVirtualDesktop.DesktopNotificationCallback()
callback.create = create
callback.change = change
callback.destroy_begin = destroy_begin
callback.destroy_failed = destroy_failed
callback.destroy = destroy
cookie = pyWinVirtualDesktop.register_notification_callback(callback)Either way will work. But make sure you hold a reference to the cookie
that is returned from calling  register_notification_callback
This cookie is what you use to unregister
pyWinVirtualDesktop.unregister_notification_callback(cookie)in the methods you override you will place whatever code it i you want
to run. The parameters that are passed are Desktop instances.