/// <summary>
 /// associate the current thread to the default desktop
 /// </summary>
 /// <returns></returns>
 internal bool BeginInteraction()
 {
     EndInteraction();
     m_hCurWinsta = User32DLL.GetProcessWindowStation();
     if (m_hCurWinsta == IntPtr.Zero)
     {
         return(false);
     }
     m_hCurDesktop = User32DLL.GetDesktopWindow();
     if (m_hCurDesktop == IntPtr.Zero)
     {
         return(false);
     }
     m_hWinsta = User32DLL.OpenWindowStation("winsta0", false,
                                             WindowStationAccessRight.WINSTA_ACCESSCLIPBOARD |
                                             WindowStationAccessRight.WINSTA_ACCESSGLOBALATOMS |
                                             WindowStationAccessRight.WINSTA_CREATEDESKTOP |
                                             WindowStationAccessRight.WINSTA_ENUMDESKTOPS |
                                             WindowStationAccessRight.WINSTA_ENUMERATE |
                                             WindowStationAccessRight.WINSTA_EXITWINDOWS |
                                             WindowStationAccessRight.WINSTA_READATTRIBUTES |
                                             WindowStationAccessRight.WINSTA_READSCREEN |
                                             WindowStationAccessRight.WINSTA_WRITEATTRIBUTES
                                             );
     if (m_hWinsta == IntPtr.Zero)
     {
         return(false);
     }
     User32DLL.SetProcessWindowStation(m_hWinsta);
     m_hDesk = User32DLL.OpenDesktop("default", OpenDesktopFlag.DF_NONE, false,
                                     DesktopAccessRight.DESKTOP_CREATEMENU |
                                     DesktopAccessRight.DESKTOP_CREATEWINDOW |
                                     DesktopAccessRight.DESKTOP_ENUMERATE |
                                     DesktopAccessRight.DESKTOP_HOOKCONTROL |
                                     DesktopAccessRight.DESKTOP_JOURNALPLAYBACK |
                                     DesktopAccessRight.DESKTOP_JOURNALRECORD |
                                     DesktopAccessRight.DESKTOP_READOBJECTS |
                                     DesktopAccessRight.DESKTOP_SWITCHDESKTOP |
                                     DesktopAccessRight.DESKTOP_WRITEOBJECTS
                                     );
     if (m_hDesk == IntPtr.Zero)
     {
         return(false);
     }
     User32DLL.SetThreadDesktop(m_hDesk);
     return(true);
 }
 /// <summary>
 /// restore
 /// </summary>
 internal void EndInteraction()
 {
     if (m_hCurWinsta != IntPtr.Zero)
     {
         User32DLL.SetProcessWindowStation(m_hCurWinsta);
     }
     if (m_hCurDesktop != IntPtr.Zero)
     {
         User32DLL.SetThreadDesktop(m_hCurDesktop);
     }
     if (m_hWinsta != IntPtr.Zero)
     {
         User32DLL.CloseWindowStation(m_hWinsta);
     }
     if (m_hDesk != IntPtr.Zero)
     {
         User32DLL.CloseDesktop(m_hDesk);
     }
 }