В Windows 10, как мы можем определить, к какому виртуальному рабочему столу относится окно?

Что касается Windows 10 и ее новой функции виртуального рабочего стола, есть ли способ определить, к какому виртуальному рабочему столу относится конкретное окно? И какой виртуальный рабочий стол активен?

Проблема может быть замечена при использовании Snipping Tool. Откройте инструмент и выберите New / Window Snip. Когда вы перемещаете мышь, инструмент для выделения выделяет области, в которых нет окна, но в этом месте на другом виртуальном рабочем столе есть окно.

На этой картинке Snipping Tool выделяет пустое место.

Snipping Tool не знает, на каком виртуальном рабочем столе находится конкретное окно.

Вот тот же вопрос на форумах MSDN, без ответа, но с большим количеством дополнительных деталей.

Извините, мой статус недостаточно высок, чтобы вставлять изображения или включать дополнительные ссылки.

1 ответ

Решение

Блог группы поддержки Windows SDK опубликовал демонстрационную версию C# для переключения рабочих столов через IVirtualDesktopManager:

[ComImport, InterfaceType(ComInterfaceType.InterfaceIsIUnknown), Guid("a5cd92ff-29be-454c-8d04-d82879fb3f1b")]
[System.Security.SuppressUnmanagedCodeSecurity]
public interface IVirtualDesktopManager
{
[PreserveSig]
int IsWindowOnCurrentVirtualDesktop(
    [In] IntPtr TopLevelWindow,
    [Out] out int OnCurrentDesktop
    );
[PreserveSig]
int GetWindowDesktopId(
    [In] IntPtr TopLevelWindow,
    [Out] out Guid CurrentDesktop
    );

[PreserveSig]
int MoveWindowToDesktop(
    [In] IntPtr TopLevelWindow,
    [MarshalAs(UnmanagedType.LPStruct)]
    [In]Guid CurrentDesktop
    );
}

[ComImport, Guid("aa509086-5ca9-4c25-8f95-589d3c07b48a")]
public class CVirtualDesktopManager
{

}
public class VirtualDesktopManager
{
    public VirtualDesktopManager()
    {
        cmanager = new CVirtualDesktopManager();
        manager = (IVirtualDesktopManager)cmanager;
    }
    ~VirtualDesktopManager()
    {
        manager = null;
        cmanager = null;
    }
    private CVirtualDesktopManager cmanager = null;
    private IVirtualDesktopManager manager;

    public bool IsWindowOnCurrentVirtualDesktop(IntPtr TopLevelWindow)
    {
        int result;
        int hr;
        if ((hr = manager.IsWindowOnCurrentVirtualDesktop(TopLevelWindow, out result)) != 0)
        {
            Marshal.ThrowExceptionForHR(hr);
        }
        return result != 0;
    }

    public Guid GetWindowDesktopId(IntPtr TopLevelWindow)
    {
        Guid result;
        int hr;
        if ((hr = manager.GetWindowDesktopId(TopLevelWindow, out result)) != 0)
        {
            Marshal.ThrowExceptionForHR(hr);
        }
        return result;
    }

    public void MoveWindowToDesktop(IntPtr TopLevelWindow, Guid CurrentDesktop)
    {
        int hr;
        if ((hr = manager.MoveWindowToDesktop(TopLevelWindow, CurrentDesktop)) != 0)
        {
            Marshal.ThrowExceptionForHR(hr);
        }
    }
}

Вызов GetWindowDesktopId чтобы получить GUID рабочего стола.

Другие вопросы по тегам