Skip to content

Commit

Permalink
fix: virtual desktop with win11
Browse files Browse the repository at this point in the history
  • Loading branch information
snomiao committed Jan 19, 2022
1 parent e96b4e8 commit fb7e0f7
Showing 1 changed file with 57 additions and 4 deletions.
61 changes: 57 additions & 4 deletions Modules/03-虚拟桌面增强.ahk
Expand Up @@ -21,6 +21,10 @@
; API definitions
; [PowerShell Gallery | VirtualDesktop.ps1 1.1.0]( https://www.powershellgallery.com/packages/VirtualDesktop/1.1.0/Content/VirtualDesktop.ps1 )
; [Windows 10 の仮想デスクトップを制御しようとして失敗した話 | grabacr.nét]( http://grabacr.net/archives/5601 )
;
; ref project when updated to win11:
; [MScholtes/VirtualDesktop: C# command line tool to manage virtual desktops in Windows 10]( https://github.com/MScholtes/VirtualDesktop )
;

if !CapsLockX
ExitApp
Expand Down Expand Up @@ -229,15 +233,19 @@ MoveAllVisibleWindowToDesktop(idx)
}
SwitchToDesktop(idx)
{
if (!SwitchToDesktopByInternalAPI(idx)) {
if (SwitchToDesktopByInternalAPI(idx)) {
; ok
} else if (SwitchToDesktopByHotkey(idx)){
TrayTip, WARN, SwitchToDesktopByHotkey %idx%
SwitchToDesktopByHotkey(idx)
} else {
TrayTip, WARN, SwitchToDeskto FAILED
}
return idx
}
SwitchToDesktopByHotkey(idx)
{
static lastIdx := ""
if (!lastIdx || idx == 1){
if (!lastIdx || idx == 1) {
Loop 10 {
SendEvent ^#{Left}
}
Expand All @@ -253,6 +261,8 @@ SwitchToDesktopByHotkey(idx)
SendEvent ^#{Left}
}
lastIdx := idx

return idx
}

IsWindowOnCurrentVirtualDesktop(hWnd)
Expand All @@ -267,11 +277,54 @@ IsWindowOnCurrentVirtualDesktop(hWnd)
ObjRelease(IVirtualDesktopManager)
Return %bool%
}
SwitchToDesktopByInternalAPI_Win11(idx)
{
succ := 0
IServiceProvider := ComObjCreate("{C2F03A33-21F5-47FA-B4BB-156362A2F239}", "{6D5140C1-7436-11CE-8034-00AA006009FA}")
IVirtualDesktopManagerInternal := ComObjQuery(IServiceProvider, "{C5E0CDCA-7B6E-41B2-9FC4-D93975CC467B}", "{B2F925B9-5A0F-4D2E-9F4D-2B1507593C10}")
ObjRelease(IServiceProvider)
if (IVirtualDesktopManagerInternal) {
; tooltip %idx%
GetCount := vtable(IVirtualDesktopManagerInternal, 3)
GetDesktops := vtable(IVirtualDesktopManagerInternal, 7)
SwitchDesktop := vtable(IVirtualDesktopManagerInternal, 9)
; TrayTip, , % IVirtualDesktopManagerInternal
pDesktopIObjectArray := 0
DllCall(GetDesktops, "Ptr", IVirtualDesktopManagerInternal, "Ptr*", pDesktopIObjectArray)
if (pDesktopIObjectArray) {
GetDesktopCount := vtable(pDesktopIObjectArray, 3)
GetDesktopAt := vtable(pDesktopIObjectArray, 4)
DllCall(GetDesktopCount, "Ptr", IVirtualDesktopManagerInternal, "UInt*", DesktopCount)
; tooltip %DesktopCount%
; if idx-th desktop doesn't exists then create a new desktop
if (idx > DesktopCount) {
diff := idx - DesktopCount
loop %diff% {
SendEvent ^#d
}
succ := 1
}
GetGUIDFromString(IID_IVirtualDesktop, "{FF72FFDD-BE7E-43FC-9C03-AD81681E88E4}")
DllCall(GetDesktopAt, "Ptr", pDesktopIObjectArray, "UInt", idx - 1, "Ptr", &IID_IVirtualDesktop, "Ptr*", VirtualDesktop)
ObjRelease(pDesktopIObjectArray)
if (VirtualDesktop) {
DllCall(SwitchDesktop, "Ptr", IVirtualDesktopManagerInternal, "Ptr", VirtualDesktop)
ObjRelease(VirtualDesktop)
succ := 1
}
}
ObjRelease(IVirtualDesktopManagerInternal)
}
Return succ
}

SwitchToDesktopByInternalAPI(idx)
{
succ := 0
IServiceProvider := ComObjCreate("{C2F03A33-21F5-47FA-B4BB-156362A2F239}", "{6D5140C1-7436-11CE-8034-00AA006009FA}")
IVirtualDesktopManagerInternal := ComObjQuery(IServiceProvider, "{C5E0CDCA-7B6E-41B2-9FC4-D93975CC467B}", "{F31574D6-B682-4CDC-BD56-1827860ABEC6}")
IVirtualDesktopManagerInternal_Win10 := ComObjQuery(IServiceProvider, "{C5E0CDCA-7B6E-41B2-9FC4-D93975CC467B}", "{F31574D6-B682-4CDC-BD56-1827860ABEC6}")
IVirtualDesktopManagerInternal_Win11 := ComObjQuery(IServiceProvider, "{C5E0CDCA-7B6E-41B2-9FC4-D93975CC467B}", "{B2F925B9-5A0F-4D2E-9F4D-2B1507593C10}")
IVirtualDesktopManagerInternal := IVirtualDesktopManagerInternal_Win11 ? IVirtualDesktopManagerInternal_Win11 : IVirtualDesktopManagerInternal_Win10
ObjRelease(IServiceProvider)
if (IVirtualDesktopManagerInternal) {
; tooltip %idx%
Expand Down

0 comments on commit fb7e0f7

Please sign in to comment.