Skip to content

Commit cab02a9

Browse files
oscarazmitia-aqiSlion
authored andcommitted
Support Windows 11 24H2 v26100.xxxx
Close #26.
1 parent e1b906b commit cab02a9

13 files changed

+637
-154
lines changed
Lines changed: 47 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,47 @@
1+
using WindowsDesktop.Interop.Build10240;
2+
using WindowsDesktop.Interop.Proxy;
3+
4+
namespace WindowsDesktop.Interop.Build26100;
5+
6+
internal class VirtualDesktopProvider26100 : VirtualDesktopProvider
7+
{
8+
private IVirtualDesktopManager? _virtualDesktopManager;
9+
private ApplicationViewCollection? _applicationViewCollection;
10+
private VirtualDesktopManagerInternal? _virtualDesktopManagerInternal;
11+
private VirtualDesktopPinnedApps? _virtualDesktopPinnedApps;
12+
private VirtualDesktopNotificationService? _virtualDesktopNotificationService;
13+
14+
public override IApplicationViewCollection ApplicationViewCollection
15+
=> this._applicationViewCollection ?? throw InitializationIsRequired;
16+
17+
public override IVirtualDesktopManager VirtualDesktopManager
18+
=> this._virtualDesktopManager ?? throw InitializationIsRequired;
19+
20+
public override IVirtualDesktopManagerInternal VirtualDesktopManagerInternal
21+
=> this._virtualDesktopManagerInternal ?? throw InitializationIsRequired;
22+
23+
public override IVirtualDesktopPinnedApps VirtualDesktopPinnedApps
24+
=> this._virtualDesktopPinnedApps ?? throw InitializationIsRequired;
25+
26+
public override IVirtualDesktopNotificationService VirtualDesktopNotificationService
27+
=> this._virtualDesktopNotificationService ?? throw InitializationIsRequired;
28+
29+
private protected override void InitializeCore(ComInterfaceAssembly assembly)
30+
{
31+
var type = Type.GetTypeFromCLSID(CLSID.VirtualDesktopManager)
32+
?? throw new Exception($"No type found for CLSID '{CLSID.VirtualDesktopManager}'.");
33+
this._virtualDesktopManager = Activator.CreateInstance(type) is IVirtualDesktopManager manager
34+
? manager
35+
: throw new Exception($"Failed to create instance of Type '{typeof(IVirtualDesktopManager)}'.");
36+
37+
this._applicationViewCollection = new ApplicationViewCollection(assembly);
38+
var factory = new ComWrapperFactory(
39+
x => new ApplicationView(assembly, x),
40+
x => this._applicationViewCollection.GetViewForHwnd(x),
41+
x => new VirtualDesktop(assembly, x));
42+
this._virtualDesktopManagerInternal = new VirtualDesktopManagerInternal(assembly, factory);
43+
this._virtualDesktopPinnedApps = new VirtualDesktopPinnedApps(assembly, factory);
44+
this._virtualDesktopNotificationService = new VirtualDesktopNotificationService(assembly, factory);
45+
}
46+
47+
}
Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
using System;
2+
using System.Runtime.InteropServices;
3+
using WindowsDesktop.Interop.Build10240;
4+
5+
namespace WindowsDesktop.Interop.Build26100
6+
{
7+
[ComImport]
8+
[Guid("00000000-0000-0000-0000-000000000000") /* replace at runtime */]
9+
[InterfaceType(ComInterfaceType.InterfaceIsIUnknown)]
10+
public interface IVirtualDesktop
11+
{
12+
bool IsViewVisible(IApplicationView view);
13+
14+
Guid GetID();
15+
16+
HString GetName();
17+
18+
HString GetWallpaperPath();
19+
20+
bool IsRemote();
21+
22+
23+
}
24+
}
Lines changed: 56 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,56 @@
1+
using System;
2+
using System.Runtime.InteropServices;
3+
using WindowsDesktop.Interop.Build10240;
4+
5+
namespace WindowsDesktop.Interop.Build26100
6+
{
7+
[ComImport]
8+
[Guid("00000000-0000-0000-0000-000000000000") /* replace at runtime */]
9+
[InterfaceType(ComInterfaceType.InterfaceIsIUnknown)]
10+
public interface IVirtualDesktopManagerInternal
11+
{
12+
int GetCount();
13+
14+
void MoveViewToDesktop(IApplicationView pView, IVirtualDesktop desktop);
15+
16+
bool CanViewMoveDesktops(IApplicationView pView);
17+
18+
IVirtualDesktop GetCurrentDesktop();
19+
20+
IObjectArray GetDesktops();
21+
22+
IVirtualDesktop GetAdjacentDesktop(IVirtualDesktop pDesktopReference, int uDirection);
23+
24+
void SwitchDesktop(IVirtualDesktop desktop);
25+
26+
void SwitchDesktopAndMoveForegroundView(IVirtualDesktop desktop);
27+
28+
IVirtualDesktop CreateDesktop();
29+
30+
void MoveDesktop(IVirtualDesktop desktop, int nIndex);
31+
32+
void RemoveDesktop(IVirtualDesktop pRemove, IVirtualDesktop pFallbackDesktop);
33+
34+
IVirtualDesktop FindDesktop(in Guid desktopId);
35+
36+
void GetDesktopSwitchIncludeExcludeViews(IVirtualDesktop desktop, out IObjectArray o1, out IObjectArray o2);
37+
38+
void SetDesktopName(IVirtualDesktop desktop, HString name);
39+
40+
void SetDesktopWallpaper(IVirtualDesktop desktop, HString path);
41+
42+
void UpdateWallpaperPathForAllDesktops(HString path);
43+
44+
void CopyDesktopState(IApplicationView pView0, IApplicationView pView1);
45+
46+
IVirtualDesktop CreateRemoteDesktop(HString name);
47+
48+
void SwitchRemoteDesktop(IVirtualDesktop desktop);
49+
50+
void SwitchDesktopWithAnimation(IVirtualDesktop desktop);
51+
52+
IVirtualDesktop GetLastActiveDesktop();
53+
54+
void WaitForAnimationToComplete();
55+
}
56+
}
Lines changed: 93 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,93 @@
1+
using System;
2+
using System.Runtime.InteropServices;
3+
using WindowsDesktop.Interop.Build10240;
4+
5+
namespace WindowsDesktop.Interop.Build26100
6+
{
7+
[ComImport]
8+
[Guid("00000000-0000-0000-0000-000000000000") /* replace at runtime */]
9+
[InterfaceType(ComInterfaceType.InterfaceIsIUnknown)]
10+
public interface IVirtualDesktopNotification
11+
{
12+
void VirtualDesktopCreated(IVirtualDesktop pDesktop);
13+
14+
void VirtualDesktopDestroyBegin(IVirtualDesktop pDesktopDestroyed, IVirtualDesktop pDesktopFallback);
15+
16+
void VirtualDesktopDestroyFailed(IVirtualDesktop pDesktopDestroyed, IVirtualDesktop pDesktopFallback);
17+
18+
void VirtualDesktopDestroyed(IVirtualDesktop pDesktopDestroyed, IVirtualDesktop pDesktopFallback);
19+
20+
void VirtualDesktopMoved(IVirtualDesktop pDesktop, int nIndexFrom, int nIndexTo);
21+
22+
void VirtualDesktopRenamed(IVirtualDesktop pDesktop, HString chName);
23+
24+
void ViewVirtualDesktopChanged(IApplicationView pView);
25+
26+
void CurrentVirtualDesktopChanged(IVirtualDesktop pDesktopOld, IVirtualDesktop pDesktopNew);
27+
28+
void VirtualDesktopWallpaperChanged(IVirtualDesktop pDesktop, HString chPath);
29+
30+
void VirtualDesktopSwitched(IVirtualDesktop pDesktop);
31+
32+
void RemoteVirtualDesktopConnected(IVirtualDesktop pDesktop);
33+
}
34+
35+
internal class VirtualDesktopNotification : VirtualDesktopNotificationService.EventListenerBase, IVirtualDesktopNotification
36+
{
37+
public void VirtualDesktopCreated(IVirtualDesktop pDesktop)
38+
{
39+
this.CreatedCore(pDesktop);
40+
}
41+
42+
public void VirtualDesktopDestroyBegin(IVirtualDesktop pDesktopDestroyed, IVirtualDesktop pDesktopFallback)
43+
{
44+
this.DestroyBeginCore(pDesktopDestroyed, pDesktopFallback);
45+
}
46+
47+
public void VirtualDesktopDestroyFailed(IVirtualDesktop pDesktopDestroyed, IVirtualDesktop pDesktopFallback)
48+
{
49+
this.DestroyFailedCore(pDesktopDestroyed, pDesktopFallback);
50+
}
51+
52+
public void VirtualDesktopDestroyed(IVirtualDesktop pDesktopDestroyed, IVirtualDesktop pDesktopFallback)
53+
{
54+
this.DestroyedCore(pDesktopDestroyed, pDesktopFallback);
55+
}
56+
57+
public void VirtualDesktopMoved(IVirtualDesktop pDesktop, int nIndexFrom, int nIndexTo)
58+
{
59+
this.MovedCore(pDesktop, nIndexFrom, nIndexTo);
60+
}
61+
62+
public void VirtualDesktopRenamed(IVirtualDesktop pDesktop, HString chName)
63+
{
64+
this.RenamedCore(pDesktop, chName);
65+
}
66+
67+
public void ViewVirtualDesktopChanged(IApplicationView pView)
68+
{
69+
this.ViewChangedCore(pView);
70+
}
71+
72+
public void CurrentVirtualDesktopChanged(IVirtualDesktop pDesktopOld, IVirtualDesktop pDesktopNew)
73+
{
74+
this.CurrentChangedCore(pDesktopOld, pDesktopNew);
75+
}
76+
77+
public void VirtualDesktopWallpaperChanged(IVirtualDesktop pDesktop, HString chPath)
78+
{
79+
this.WallpaperChangedCore(pDesktop, chPath);
80+
}
81+
82+
public void VirtualDesktopSwitched(IVirtualDesktop pDesktop)
83+
{
84+
this.SwitchedCore(pDesktop);
85+
}
86+
87+
public void RemoteVirtualDesktopConnected(IVirtualDesktop pDesktop)
88+
{
89+
this.RemoteConnectedCore(pDesktop);
90+
}
91+
92+
}
93+
}
Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
using System;
2+
using System.Runtime.InteropServices;
3+
4+
namespace WindowsDesktop.Interop.Build26100
5+
{
6+
[ComImport]
7+
[Guid("00000000-0000-0000-0000-000000000000") /* replace at runtime */]
8+
[InterfaceType(ComInterfaceType.InterfaceIsIUnknown)]
9+
public interface IVirtualDesktopNotificationService
10+
{
11+
uint Register(IVirtualDesktopNotification pNotification);
12+
13+
void Unregister(uint dwCookie);
14+
}
15+
}
Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,31 @@
1+
using System;
2+
using System.Collections.Generic;
3+
using System.Linq;
4+
using WindowsDesktop.Interop.Proxy;
5+
6+
namespace WindowsDesktop.Interop.Build26100;
7+
8+
internal class VirtualDesktop : ComWrapperBase<IVirtualDesktop>, IVirtualDesktop
9+
{
10+
private Guid? _id;
11+
12+
public VirtualDesktop(ComInterfaceAssembly assembly, object comObject)
13+
: base(assembly, comObject)
14+
{
15+
}
16+
17+
public bool IsViewVisible(IntPtr hWnd)
18+
=> this.InvokeMethod<bool>(Args(hWnd));
19+
20+
public Guid GetID()
21+
=> this._id ?? (Guid)(this._id = this.InvokeMethod<Guid>());
22+
23+
public string GetName()
24+
=> this.InvokeMethod<HString>();
25+
26+
public string GetWallpaperPath()
27+
=> this.InvokeMethod<HString>();
28+
29+
public bool IsRemote()
30+
=> this.InvokeMethod<bool>();
31+
}
Lines changed: 68 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,68 @@
1+
using System;
2+
using System.Collections.Generic;
3+
using System.Runtime.CompilerServices;
4+
using WindowsDesktop.Interop.Proxy;
5+
6+
namespace WindowsDesktop.Interop.Build26100;
7+
8+
internal class VirtualDesktopManagerInternal : ComWrapperBase<IVirtualDesktopManagerInternal>, IVirtualDesktopManagerInternal
9+
{
10+
private readonly ComWrapperFactory _factory;
11+
12+
public VirtualDesktopManagerInternal(ComInterfaceAssembly assembly, ComWrapperFactory factory)
13+
: base(assembly, CLSID.VirtualDesktopManagerInternal)
14+
{
15+
this._factory = factory;
16+
}
17+
18+
public IEnumerable<IVirtualDesktop> GetDesktops()
19+
{
20+
var array = this.InvokeMethod<IObjectArray>();
21+
if (array == null) yield break;
22+
23+
var count = array.GetCount();
24+
var vdType = this.ComInterfaceAssembly.GetType(nameof(IVirtualDesktop));
25+
26+
for (var i = 0u; i < count; i++)
27+
{
28+
var ppvObject = array.GetAt(i, vdType.GUID);
29+
yield return new VirtualDesktop(this.ComInterfaceAssembly, ppvObject);
30+
}
31+
}
32+
33+
public IVirtualDesktop GetCurrentDesktop()
34+
=> this.InvokeMethodAndWrap();
35+
36+
public IVirtualDesktop GetAdjacentDesktop(IVirtualDesktop pDesktopReference, AdjacentDesktop uDirection)
37+
=> this.InvokeMethodAndWrap(Args(((VirtualDesktop)pDesktopReference).ComObject, uDirection));
38+
39+
public IVirtualDesktop FindDesktop(Guid desktopId)
40+
=> this.InvokeMethodAndWrap(Args(desktopId));
41+
42+
public IVirtualDesktop CreateDesktop()
43+
=> this.InvokeMethodAndWrap();
44+
45+
public void SwitchDesktop(IVirtualDesktop desktop)
46+
=> this.InvokeMethod(Args(((VirtualDesktop)desktop).ComObject));
47+
48+
public void MoveDesktop(IVirtualDesktop pMove, int nIndex)
49+
=> this.InvokeMethod(Args(((VirtualDesktop)pMove).ComObject, nIndex));
50+
51+
public void RemoveDesktop(IVirtualDesktop pRemove, IVirtualDesktop pFallbackDesktop)
52+
=> this.InvokeMethod(Args(((VirtualDesktop)pRemove).ComObject, ((VirtualDesktop)pFallbackDesktop).ComObject));
53+
54+
public void MoveViewToDesktop(IntPtr hWnd, IVirtualDesktop desktop)
55+
=> this.InvokeMethod(Args(this._factory.ApplicationViewFromHwnd(hWnd).ComObject, ((VirtualDesktop)desktop).ComObject));
56+
57+
public void SetDesktopName(IVirtualDesktop desktop, string name)
58+
=> this.InvokeMethod(Args(((VirtualDesktop)desktop).ComObject, new HString(name)));
59+
60+
public void SetDesktopWallpaper(IVirtualDesktop desktop, string path)
61+
=> this.InvokeMethod(Args(((VirtualDesktop)desktop).ComObject, new HString(path)));
62+
63+
public void UpdateWallpaperPathForAllDesktops(string path)
64+
=> this.InvokeMethod(Args(new HString(path)));
65+
66+
private VirtualDesktop InvokeMethodAndWrap(object?[]? parameters = null, [CallerMemberName] string methodName = "")
67+
=> new(this.ComInterfaceAssembly, this.InvokeMethod<object>(parameters, methodName) ?? throw new Exception("Failed to get IVirtualDesktop instance."));
68+
}

0 commit comments

Comments
 (0)