diff --git a/src/Windows/Avalonia.Win32/WindowImpl.cs b/src/Windows/Avalonia.Win32/WindowImpl.cs
index 6bbcb3dc92..ba7f90eb63 100644
--- a/src/Windows/Avalonia.Win32/WindowImpl.cs
+++ b/src/Windows/Avalonia.Win32/WindowImpl.cs
@@ -46,6 +46,7 @@ namespace Avalonia.Win32
private SavedWindowInfo _savedWindowInfo;
private bool _fullScreen;
+ private IntPtr _taskBarList;
#if USE_MANAGED_DRAG
private readonly ManagedWindowResizeDragHelper _managedDrag;
@@ -218,39 +219,46 @@ namespace Avalonia.Win32
}
}
- private void MarkFullscreen(bool fullscreen)
+ ///
+ /// Ported from https://github.com/chromium/chromium/blob/master/ui/views/win/fullscreen_handler.cc
+ ///
+ /// Fullscreen state.
+ private unsafe void MarkFullscreen(bool fullscreen)
{
- //if (!task_bar_list_)
- //{
- // HRESULT hr =
+ if (_taskBarList == IntPtr.Zero)
+ {
+ Guid clsid = ShellIds.TaskBarList;
+ Guid iid = ShellIds.ITaskBarList2;
+
+ int result = CoCreateInstance(ref clsid, IntPtr.Zero, 1, ref iid, out _taskBarList);
+
+ if (_taskBarList != IntPtr.Zero)
+ {
+ var ptr = (ITaskBarList2VTable**)_taskBarList.ToPointer();
+ var hrInit = Marshal.GetDelegateForFunctionPointer((*ptr)->HrInit);
- // ::CoCreateInstance(CLSID_TaskbarList, nullptr, CLSCTX_INPROC_SERVER,
- // IID_PPV_ARGS(&task_bar_list_));
- // if (SUCCEEDED(hr) && FAILED(task_bar_list_->HrInit()))
- // task_bar_list_ = nullptr;
- //}
+ if (hrInit(_taskBarList) != HRESULT.S_OK)
+ {
+ _taskBarList = IntPtr.Zero;
+ }
+ }
+ }
- //// As per MSDN marking the window as fullscreen should ensure that the
- //// taskbar is moved to the bottom of the Z-order when the fullscreen window
- //// is activated. If the window is not fullscreen, the Shell falls back to
- //// heuristics to determine how the window should be treated, which means
- //// that it could still consider the window as fullscreen. :(
- //if (task_bar_list_)
- // task_bar_list_->MarkFullscreenWindow(hwnd_, !!fullscreen);
+ if (_taskBarList != IntPtr.Zero)
+ {
+ var ptr = (ITaskBarList2VTable**)_taskBarList.ToPointer();
+ var markFullscreen = Marshal.GetDelegateForFunctionPointer((*ptr)->MarkFullscreenWindow);
+ markFullscreen(_taskBarList, _hwnd, fullscreen);
+ }
}
+ ///
+ /// Ported from https://github.com/chromium/chromium/blob/master/ui/views/win/fullscreen_handler.cc
+ ///
+ ///
private void SetFullScreen(bool fullscreen)
{
- // Ported from https://github.com/chromium/chromium/blob/master/ui/views/win/fullscreen_handler.cc
- //std::unique_ptr visibility;
-
- // With Aero enabled disabling the visibility causes the window to disappear
- // for several frames, which looks worse than doing other updates
- // non-atomically.
- //if (!ui::win::IsAeroGlassEnabled())
- // visibility = std::make_unique(hwnd_);
-
// Save current window state if not already fullscreen.
if (!_fullScreen)
{