728x90
반응형
728x170
▶ 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
반응형
그리드형(광고전용)
'C# > WinForm' 카테고리의 다른 글
[C#/WINFORM] WebBrowser 클래스 : Internet Explorer 버전 11 사용하기 (0) | 2021.11.23 |
---|---|
[C#/WINFORM] 카카오 링크를 사용해 나에게 카카오톡 메시지 보내기 (기능 개선) (0) | 2021.11.23 |
[C#/WINFORM] 카카오 링크를 사용해 나에게 카카오톡 메시지 보내기 (0) | 2021.11.23 |
[C#/WINFORM] PrintWindow API 함수를 사용해 윈도우 비트맵 구하기 (0) | 2021.11.14 |
[C#/WINFORM] 3D 차트 사용하기 (0) | 2021.10.22 |
[C#/WINFORM] 가상 데스크톱 전환하기 (0) | 2021.09.10 |
[C#/WINFORM] Screen 클래스 : FromHandle 정적 메소드를 사용해 특정 윈도우가 속한 화면 구하기 (0) | 2021.09.04 |
[C#/WINFORM] Form 클래스 : MouseDown/MouseMove/MouseUp 이벤트를 사용해 테두리 없는 폼 만들기 (0) | 2021.08.30 |
[C#/WINFORM] SendKeys 클래스 : SendWait 정적 메소드를 사용해 메모장에 문자열 추가하기 (0) | 2021.08.30 |
[C#/WINFORM] Control 클래스 : IsKeyLocked 정적 메소드를 사용해 CAPS LOCK 키 눌림 여부 구하기 (0) | 2021.08.27 |
[C#/WINFORM] 볼륨 제어하기 (0) | 2021.08.27 |
댓글을 달아 주세요