Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- if !VD := new VirtualDesktops
- ExitApp
- DtCur := VD.GetCurrent() ; returns current desktop ID
- Gui, New, +hwndhWnd -Caption
- Gui, Color, 0x55AAFF
- Gui, Font, s24, Calibri
- Gui, Add, Text, center, % "This is the current virtual desktop.`n Let's create new one and move this window there "
- Gui, Show
- Sleep, 4000
- DtNew := VD.CreateDesktop() ; returns new desktop ID
- VD.SwitchTo(DtNew) ; switch to new desktop
- Sleep, 1000
- VD.MoveWindowTo(hWnd, DtNew)
- Sleep, 1000
- Gui, Color, 0xFFAA55
- GuiControl,, Static1, This is the new virtual desktop.`nNow we'll move this window back to the initial desktop
- Sleep, 4000
- VD.SwitchTo(DtCur)
- Sleep, 1000
- VD.MoveWindowTo(hWnd, DtCur)
- WinActivate, ahk_id %hWnd%
- Sleep, 1000
- Gui, Color, 0x55AAFF
- GuiControl,, Static1, This is the initial virtual desktop.`nLet's make this window pinned
- Sleep, 3000
- VD.TogglePinWindow(hWnd) ; pins the window, so it appears on all the desktops
- Gui, Color, 0xDDCC33
- GuiControl,, Static1, Now this window is pinned
- Sleep, 3000
- VD.SwitchTo(DtNew)
- Sleep, 2000
- VD.SwitchTo(DtCur)
- Sleep, 2000
- GuiControl,, Static1, Now we'll remove the previously created desktop and terminate the script
- Sleep, 3000
- Gui, Destroy
- VD.Remove(DtNew, DtCur)
- ExitApp
- class VirtualDesktops
- {
- /*
- public methods:
- CreateDesktop() // returns ID
- Remove(ID, ID_fallback := "")
- GetCurrent() // returns ID
- GetFromWindow(hWnd) // returns ID
- GetCount() // returns count of existing desktops
- GetDesktops() // returns IDs array
- GetAdjacent(direction := "right", ID_start := "") // returns ID
- Switch(direction := "right")
- SwitchTo(ID)
- MoveWindow(hWnd, direction := "right")
- MoveWindowTo(hWnd, ID)
- TogglePinWindow(hWnd)
- */
- static CLSID_ImmersiveShell := "{C2F03A33-21F5-47FA-B4BB-156362A2F239}"
- , CLSID_VirtualDesktopManager := "{AA509086-5CA9-4C25-8F95-589D3C07B48A}"
- , CLSID_VirtualDesktopPinnedApps := "{B5A399E7-1C87-46B8-88E9-FC5747B171BD}"
- , CLSID_VirtualDesktopManagerInternal := "{C5E0CDCA-7B6E-41B2-9FC4-D93975CC467B}"
- , IID_IUnknown := "{00000000-0000-0000-C000-000000000046}"
- , IID_IServiceProvider := "{6D5140C1-7436-11CE-8034-00AA006009FA}"
- , IID_IVirtualDesktop := "{FF72FFDD-BE7E-43FC-9C03-AD81681E88E4}"
- , IID_IVirtualDesktopManager := "{A5CD92FF-29BE-454C-8D04-D82879FB3F1B}"
- , IID_IVirtualDesktopPinnedApps := "{4CE81583-1E4C-4632-A621-07A53543148F}"
- , IID_IVirtualDesktopManagerInternal := "{F31574D6-B682-4CDC-BD56-1827860ABEC6}"
- , IID_IApplicationViewCollection := "{1841C6D7-4F9D-42C0-AF41-8747538F10E5}"
- , IID_IApplicationViewCollection_Old := "{2C08ADF0-A386-4B35-9250-0FE183476FCC}"
- __New() {
- if (A_OSVersion ~= "^\D") {
- MsgBox, 48, Class VirtualDesktops, This class requires Windows 10 or later!
- Return
- }
- ImmersiveShell := ComObjCreate(this.CLSID_ImmersiveShell, this.IID_IUnknown)
- if !this.IApplicationViewCollection := ComObjQuery(ImmersiveShell, this.IID_IApplicationViewCollection
- , this.IID_IApplicationViewCollection)
- this.IApplicationViewCollection := ComObjQuery(ImmersiveShell, this.IID_IApplicationViewCollection_Old
- , this.IID_IApplicationViewCollection_Old)
- if !this.IApplicationViewCollection {
- MsgBox, IApplicationViewCollection interface not supported.
- Return
- }
- this.IVirtualDesktopManager := ComObjCreate(this.CLSID_VirtualDesktopManager, this.IID_IVirtualDesktopManager)
- IServiceProvider := ComObjCreate(this.CLSID_ImmersiveShell, this.IID_IServiceProvider)
- this.IVirtualDesktopManagerInternal := ComObjQuery(IServiceProvider, this.CLSID_VirtualDesktopManagerInternal
- , this.IID_IVirtualDesktopManagerInternal)
- this.IVirtualDesktopPinnedApps := ComObjQuery(IServiceProvider, this.CLSID_VirtualDesktopPinnedApps
- , this.IID_IVirtualDesktopPinnedApps)
- for k, v in [ImmersiveShell, IServiceProvider]
- ObjRelease(v)
- }
- __Delete() {
- for k, v in [ "IApplicationViewCollection" , "IVirtualDesktopManager"
- , "IVirtualDesktopManagerInternal", "IVirtualDesktopPinnedApps" ]
- ObjRelease(this[v])
- }
- CreateDesktop() {
- this._Vtable(this.IVirtualDesktopManagerInternal, CreateDesktop := 10).Call("PtrP", IVirtualDesktop)
- ID := this._GetID(IVirtualDesktop)
- ObjRelease(IVirtualDesktop)
- Return ID
- }
- Remove(ID, ID_fallback := "") {
- if !IVirtualDesktop := this._FindDesktop(ID)
- Return false
- if !ID_fallback {
- Arr := this.GetDesktops()
- if (Arr[1] = ID)
- ID_fallback := Arr[2]
- else {
- for k, v in Arr
- if (v = ID && ID_fallback := Arr[k - 1])
- break
- }
- }
- if IVirtualDesktop_fallback := this._FindDesktop(ID_fallback) {
- res := this._Vtable(this.IVirtualDesktopManagerInternal, RemoveDesktop := 11).Call( "Ptr", IVirtualDesktop
- , "Ptr", IVirtualDesktop_fallback )
- ObjRelease(IVirtualDesktop_fallback)
- }
- ObjRelease(IVirtualDesktop)
- Return res = 0
- }
- GetCurrent() {
- this._Vtable(this.IVirtualDesktopManagerInternal, GetCurrentDesktop := 6).Call("PtrP", IVirtualDesktop)
- ID := this._GetID(IVirtualDesktop)
- ObjRelease(IVirtualDesktop)
- Return ID
- }
- GetFromWindow(hWnd) {
- if !WinExist("ahk_id" hWnd)
- Return false
- VarSetCapacity(GUID, 16, 0)
- res := this._Vtable(this.IVirtualDesktopManager, GetWindowDesktopId := 4).Call("Ptr", hWnd, "Ptr", &GUID)
- if (res = 0) {
- VarSetCapacity(sGuid, 78) ; (38 + 1) * 2
- DllCall("ole32\StringFromGUID2", "Ptr", &GUID, "Ptr", &sGuid, "Int", 39)
- ID := StrGet(&sGuid, "UTF-16")
- }
- Return ID ? ID : false
- }
- GetCount() {
- this._Vtable(this.IVirtualDesktopManagerInternal, GetCount := 3).Call("UIntP", virtualDesktopCount)
- Return virtualDesktopCount
- }
- GetDesktops() {
- this._Vtable(this.IVirtualDesktopManagerInternal, GetDesktops := 7).Call("PtrP", IObjectArray)
- this._Vtable(IObjectArray, GetCount := 3).Call("UIntP", desktopCount)
- Desktops := []
- VarSetCapacity(GUID, 16, 0)
- DllCall("ole32\CLSIDFromString", "Str", this.IID_IVirtualDesktop, "Ptr", &GUID, "UInt")
- Loop % desktopCount {
- this._Vtable(IObjectArray, GetAt := 4).Call("UInt", A_Index - 1, "Ptr", &GUID, "PtrP", IVirtualDesktop)
- ID := this._GetID(IVirtualDesktop)
- ObjRelease(IVirtualDesktop)
- Desktops.Push(ID)
- }
- ObjRelease(IObjectArray)
- Return Desktops
- }
- GetAdjacent(direction := "right", ID_start := "") {
- static dirEnum := {left: 3, right: 4}
- ( !ID_start && ID_start := this.GetCurrent() )
- IVirtualDesktopStart := this._FindDesktop(ID_start)
- res := this._Vtable(this.IVirtualDesktopManagerInternal, GetAdjacentDesktop := 8).Call( "Ptr", IVirtualDesktopStart
- , "Int", dirEnum[direction]
- , "PtrP", IVirtualDesktopOut )
- if (res = 0) {
- ID_Adjacent := this._GetID(IVirtualDesktopOut)
- ObjRelease(IVirtualDesktopOut)
- }
- ObjRelease(IVirtualDesktopStart)
- Return ID_Adjacent
- }
- Switch(direction := "right") {
- ID := this.GetAdjacent(direction)
- Return ID ? this.SwitchTo(ID) : false
- }
- SwitchTo(ID) {
- IVirtualDesktop := this._FindDesktop(ID)
- res := this._Vtable(this.IVirtualDesktopManagerInternal, SwitchDesktop := 9).Call("Ptr", IVirtualDesktop)
- ObjRelease(IVirtualDesktop)
- Return res = 0
- }
- MoveWindow(hWnd, direction := "right") {
- if !WinExist("ahk_id" hWnd)
- Return false
- WinGetClass, WinClass, ahk_id %hWnd%
- if (WinClass ~= "Progman|WorkerW|Shell_TrayWnd")
- Return false
- ID_start := this.GetFromWindow(hWnd)
- ID := this.GetAdjacent(direction, ID_start)
- Return this.MoveWindowTo(hWnd, ID)
- }
- MoveWindowTo(hWnd, ID) {
- IVirtualDesktop := this._FindDesktop(ID)
- this._Vtable(this.IApplicationViewCollection , GetViewForHwnd := 6).Call("Ptr", hWnd, "PtrP", IApplicationView)
- this._Vtable(this.IVirtualDesktopManagerInternal, CanViewMoveDesktops := 5).Call("Ptr", IApplicationView, "UIntP", canMove)
- if canMove
- res := this._Vtable(this.IVirtualDesktopManagerInternal, MoveViewToDesktop := 4).Call( "Ptr", IApplicationView
- , "Ptr", IVirtualDesktop )
- ObjRelease(IApplicationView), ObjRelease(IVirtualDesktop)
- Return res = 0
- }
- TogglePinWindow(hWnd) {
- if !WinExist("ahk_id" hWnd)
- Return false
- WinGetClass, WinClass, ahk_id %hWnd%
- if (WinClass ~= "Progman|WorkerW|Shell_TrayWnd")
- Return false
- this._Vtable(this.IApplicationViewCollection, GetViewForHwnd := 6).Call("Ptr", hWnd, "PtrP", IApplicationView)
- this._Vtable(this.IVirtualDesktopPinnedApps , IsViewPinned := 6).Call("Ptr", IApplicationView, "UIntP", isPinned)
- res := this._Vtable(this.IVirtualDesktopPinnedApps, isPinned ? UnpinView := 8 : PinView := 7).Call("Ptr", IApplicationView)
- ObjRelease(IApplicationView)
- Return res = 0
- }
- _FindDesktop(ID) {
- VarSetCapacity(GUID, 16, 0)
- DllCall("ole32\CLSIDFromString", "Str", ID, "Ptr", &GUID, "UInt")
- res := this._Vtable(this.IVirtualDesktopManagerInternal, FindDesktop := 12).Call("Ptr", &GUID, "PtrP", IVirtualDesktop)
- Return res = 0 ? IVirtualDesktop : false
- }
- _GetID(IVirtualDesktop) {
- VarSetCapacity(GUID, 16, 0)
- this._Vtable(IVirtualDesktop, GetID := 4).Call("Ptr", &GUID)
- VarSetCapacity(sGuid, 78) ; (38 + 1) * 2
- DllCall("ole32\StringFromGUID2", "Ptr", &GUID, "Ptr", &sGuid, "Int", 39)
- Return ID := StrGet(&sGuid, "UTF-16")
- }
- _Vtable(ptr, n) {
- return Func("DllCall").Bind(NumGet(NumGet(ptr+0), A_PtrSize*n), "Ptr", ptr)
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement