첨부 실행 코드는 나눔고딕코딩 폰트를 사용합니다.
본 블로그는 광고를 포함하고 있습니다.
광고 클릭에서 발생하는 수익금은 모두 블로그 콘텐츠 향상을 위해 쓰여집니다.

728x90
반응형
728x170

TestProject.zip
0.02MB

▶ CVirtualDesktopManager.cs

using System;
using System.Runtime.InteropServices;

namespace TestProject
{
    /// <summary>
    /// C 가상 데스크톱 관리자
    /// </summary>
    [ComImport, Guid("AA509086-5CA9-4C25-8F95-589D3C07B48A")]
    public class CVirtualDesktopManager
    {
    }
}

 

728x90

 

▶ IVirtualDesktopManager.cs

using System;
using System.Runtime.InteropServices;
using System.Security;

namespace TestProject
{
    /// <summary>
    /// 가상 데스크톱 관리자 인터페이스
    /// </summary>
    [ComImport]
    [InterfaceType(ComInterfaceType.InterfaceIsIUnknown)]
    [Guid("A5CD92FF-29BE-454C-8D04-D82879FB3F1B")]
    [SuppressUnmanagedCodeSecurity]
    public interface IVirtualDesktopManager
    {
        //////////////////////////////////////////////////////////////////////////////////////////////////// Method

        #region 윈도우의 현재 가상 데스크톱 상위 여부 구하기 - IsWindowOnCurrentVirtualDesktop(topLevelWindowHandle, onCurrentDesktop)

        /// <summary>
        /// 윈도우의 현재 가상 데스크톱 상위 여부 구하기
        /// </summary>
        /// <param name="topLevelWindowHandle">최상위 윈도우 핸들</param>
        /// <param name="onCurrentDesktop">현재 데스크톱 상위 여부</param>
        /// <returns></returns>
        [PreserveSig]
        int IsWindowOnCurrentVirtualDesktop([In] IntPtr topLevelWindowHandle, [Out] out int onCurrentDesktop);

        #endregion
        #region 윈도우 데스크톱 ID 구하기 - GetWindowDesktopId(topLevelWindowHandle, currentDesktopGUID)

        /// <summary>
        /// 윈도우 데스크톱 ID 구하기
        /// </summary>
        /// <param name="topLevelWindowHandle">최상위 레벨 윈도우 핸들</param>
        /// <param name="currentDesktopGUID">현재 데스크톱 GUID</param>
        /// <returns>처리 결과</returns>
        [PreserveSig]
        int GetWindowDesktopId([In] IntPtr topLevelWindowHandle, [Out] out Guid currentDesktopGUID);

        #endregion
        #region 데스크톱으로 윈도우 이동시키기 - MoveWindowToDesktop(topLevelWindowHandle, currentDesktopGUID)

        /// <summary>
        /// 데스크톱으로 윈도우 이동시키기
        /// </summary>
        /// <param name="topLevelWindowHandle">최상위 레벨 윈도우 핸들</param>
        /// <param name="currentDesktopGUID">현재 데스크톱 GUID</param>
        /// <returns>처리 결과</returns>
        [PreserveSig]
        int MoveWindowToDesktop([In] IntPtr topLevelWindowHandle, [MarshalAs(UnmanagedType.LPStruct)][In]Guid currentDesktopGUID);

        #endregion
    }
}

 

300x250

 

▶ VirtualDesktopManager.cs

using System;
using System.Runtime.InteropServices;

namespace TestProject
{
    /// <summary>
    /// 가상 데스크톱 관리자
    /// </summary>
    public class VirtualDesktopManager
    {
        //////////////////////////////////////////////////////////////////////////////////////////////////// Field
        ////////////////////////////////////////////////////////////////////////////////////////// Private

        #region Field

        /// <summary>
        /// C 가상 데스크톱 관리자
        /// </summary>
        private CVirtualDesktopManager cVirtualDesktopManager = null;

        /// <summary>
        /// 가상 데스크톱 관리자 인터페이스
        /// </summary>
        private IVirtualDesktopManager iVirtualDesktopManager;

        #endregion

        //////////////////////////////////////////////////////////////////////////////////////////////////// Constructor
        ////////////////////////////////////////////////////////////////////////////////////////// Public

        #region 생성자 - VirtualDesktopManager()

        /// <summary>
        /// 생성자
        /// </summary>
        public VirtualDesktopManager()
        {
            this.cVirtualDesktopManager = new CVirtualDesktopManager();
            this.iVirtualDesktopManager = (IVirtualDesktopManager)this.cVirtualDesktopManager;
        }

        #endregion

        //////////////////////////////////////////////////////////////////////////////////////////////////// Destructor

        #region 소멸자 - ~VirtualDesktopManager()

        /// <summary>
        /// 소멸자
        /// </summary>
        ~VirtualDesktopManager()
        {
            this.iVirtualDesktopManager = null;
            this.cVirtualDesktopManager = null;
        }

        #endregion

        //////////////////////////////////////////////////////////////////////////////////////////////////// Method
        ////////////////////////////////////////////////////////////////////////////////////////// Public

        #region 윈도우의 현재 가상 데스크톱 상위 여부 구하기 - IsWindowOnCurrentVirtualDesktop(topLevelWindowHandle)

        /// <summary>
        /// 윈도우의 현재 가상 데스크톱 상위 여부 구하기
        /// </summary>
        /// <param name="topLevelWindowHandle">최상위 레벨 윈도우 핸들</param>
        /// <returns>윈도우의 현재 가상 데스크톱 상위 여부</returns>
        public bool IsWindowOnCurrentVirtualDesktop(IntPtr topLevelWindowHandle)
        {
            int result;

            int resultHandle;

            if((resultHandle = this.iVirtualDesktopManager.IsWindowOnCurrentVirtualDesktop(topLevelWindowHandle, out result)) != 0)
            {
                Marshal.ThrowExceptionForHR(resultHandle);
            }

            return result != 0;
        }

        #endregion
        #region 윈도우 데스크톱 ID 구하기 - GetWindowDesktopID(topLevelWindowHandle)

        /// <summary>
        /// 윈도우 데스크톱 ID 구하기
        /// </summary>
        /// <param name="topLevelWindowHandle">최상위 레벨 윈도우 핸들</param>
        /// <returns>윈도우 데스크톱 ID</returns>
        public Guid GetWindowDesktopID(IntPtr topLevelWindowHandle)
        {
            Guid guid;

            int resultHandle;

            if((resultHandle = this.iVirtualDesktopManager.GetWindowDesktopId(topLevelWindowHandle, out guid)) != 0)
            {
                Marshal.ThrowExceptionForHR(resultHandle);
            }

            return guid;
        }

        #endregion
        #region 데스톱으로 윈도우 이동시키기 - MoveWindowToDesktop(topLevelWindowHandle, currentDesktopID)

        /// <summary>
        /// 데스톱으로 윈도우 이동시키기
        /// </summary>
        /// <param name="topLevelWindowHandle">최상위 레벨 윈도우 핸들</param>
        /// <param name="currentDesktopID">현재 데스크톱 ID</param>
        public void MoveWindowToDesktop(IntPtr topLevelWindowHandle, Guid currentDesktopID)
        {
            int resultHandle;

            if((resultHandle = this.iVirtualDesktopManager.MoveWindowToDesktop(topLevelWindowHandle, currentDesktopID)) != 0)
            {
                Marshal.ThrowExceptionForHR(resultHandle);
            }
        }

        #endregion
    }
}

 

▶ CustomForm.cs

using System.Windows.Forms;

namespace TestProject
{
    /// <summary>
    /// 커스텀 폼
    /// </summary>
    public class CustomForm : Form
    {
    }
}

 

▶ MainForm.cs

using System;
using System.Windows.Forms;

namespace TestProject
{
    /// <summary>
    /// 메인 폼
    /// </summary>
    public partial class MainForm : Form
    {
        //////////////////////////////////////////////////////////////////////////////////////////////////// Field
        ////////////////////////////////////////////////////////////////////////////////////////// Private

        #region Field

        /// <summary>
        /// 가상 데스크톱 관리자
        /// </summary>
        private VirtualDesktopManager virtualDesktopManager;

        #endregion

        //////////////////////////////////////////////////////////////////////////////////////////////////// Constructor
        ////////////////////////////////////////////////////////////////////////////////////////// Public

        #region 생성자 - MainForm()

        /// <summary>
        /// 생성자
        /// </summary>
        public MainForm()
        {
            InitializeComponent();

            Load                    += Form_Load;
            this.timer.Tick         += timer_Tick;
            this.messageLabel.Click += messagelabel_Click;
        }

        #endregion

        //////////////////////////////////////////////////////////////////////////////////////////////////// Method
        ////////////////////////////////////////////////////////////////////////////////////////// Private

        #region 폼 로드시 처리하기 - Form_Load(sender, e)

        /// <summary>
        /// 폼 로드시 처리하기
        /// </summary>
        /// <param name="sender">이벤트 발생자</param>
        /// <param name="e">이벤트 인자</param>
        private void Form_Load(object sender, EventArgs e)
        {
            this.virtualDesktopManager = new VirtualDesktopManager();
        }

        #endregion
        #region 타이머 틱 처리하기 - timer_Tick(sender, e)

        /// <summary>
        /// 타이머 틱 처리하기
        /// </summary>
        /// <param name="sender">이벤트 발생자</param>
        /// <param name="e">이벤트 인자</param>
        private void timer_Tick(object sender, EventArgs e)
        {
            try
            {
                if(!this.virtualDesktopManager.IsWindowOnCurrentVirtualDesktop(Handle))
                {
                    using(CustomForm customForm = new CustomForm())
                    {
                        customForm.Show(null);

                        this.virtualDesktopManager.MoveWindowToDesktop
                        (
                            Handle,
                            this.virtualDesktopManager.GetWindowDesktopID(customForm.Handle)
                        );
                    }
                }
            }
            catch
            {
            }
        }

        #endregion
        #region 메시지 레이블 클릭시 처리하기 - messagelabel_Click(sender, e)

        /// <summary>
        /// 메시지 레이블 클릭시 처리하기
        /// </summary>
        /// <param name="sender">이벤트 발생자</param>
        /// <param name="e">이벤트 인자</param>
        private void messagelabel_Click(object sender, EventArgs e)
        {
            string virtualDesktopID        = this.virtualDesktopManager.GetWindowDesktopID(Handle).ToString().ToUpper();
            bool   onCurrentVirtualDesktop = this.virtualDesktopManager.IsWindowOnCurrentVirtualDesktop(Handle);

            MessageBox.Show($"가상 데스크톱 ID : {virtualDesktopID}\n현재 가상 데스크톱 여부 : {onCurrentVirtualDesktop}");
        }

        #endregion
    }
}

※ 추가된 가상 데스크톱에 실행 프로그램이 없어도 자동으로 해당 가상 데스크톱으로 실행 프로그램이 표시된다.

728x90
반응형
그리드형
Posted by 사용자 icodebroker

댓글을 달아 주세요