c# - Windows 10 中虚拟桌面的编程控制

标签 c# windows winapi windows-10

我喜欢 Windows 10 现在支持内置的虚拟桌面,但我有一些我想添加/修改的功能(例如,强制一个窗口出现在所有桌面上,使用热键启动任务 View ,每个-监控桌面等)
我搜索了应用程序和开发人员引用资料来帮助我定制我的桌面,但我没有运气。
我应该从哪里开始?我正在寻找 Windows API 函数(理想情况下,可以从 C# 应用程序调用),这将使我能够以编程方式访问来操作虚拟桌面和其中的窗口。

最佳答案

Windows SDK Support Team Blog发表了 C# demo to switch Desktops通过 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);
        }
    }
}
它包括用于检测窗口显示在哪个桌面上的 API,并且它可以将 Windows 切换和移动到桌面。

关于c# - Windows 10 中虚拟桌面的编程控制,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31983767/

相关文章:

c# - InvalidDataException : Multipart body length limit 16384 exceeded

java - 如何在JNA中映射Windows API CredWrite/CredRead?

c - 如何使用 WinAPI 作为另一个用户启动通用应用程序?

c++ - 在工作组 Windows Server 2008 R2 上运行时 NetUserAdd 失败

c# - 单元测试的可重用设置

c# - Windows 启动时运行程序(登录前)

c# - 有没有人知道 SQL Server 错误号 C# 包装器?

android - Cordova Build Android 失败,退出代码为 ENOENT

java - 托盘图标通知气球不适用于 Windows 10

c++ - 如何检测桌面应用程序是否已被修改?