Index: /trunk/include/VBox/HostServices/VBoxCrOpenGLSvc.h
===================================================================
--- /trunk/include/VBox/HostServices/VBoxCrOpenGLSvc.h	(revision 50393)
+++ /trunk/include/VBox/HostServices/VBoxCrOpenGLSvc.h	(revision 50394)
@@ -49,4 +49,5 @@
 #define SHCRGL_HOST_FN_VIEWPORT_CHANGED2 (23)
 #define SHCRGL_HOST_FN_TAKE_SCREENSHOT (24)
+#define SHCRGL_HOST_FN_WINDOWS_SHOW (25)
 /* crOpenGL guest functions */
 #define SHCRGL_GUEST_FN_WRITE       (2)
Index: /trunk/src/VBox/GuestHost/OpenGL/include/cr_server.h
===================================================================
--- /trunk/src/VBox/GuestHost/OpenGL/include/cr_server.h	(revision 50393)
+++ /trunk/src/VBox/GuestHost/OpenGL/include/cr_server.h	(revision 50394)
@@ -526,4 +526,5 @@
 } CR_SCREENSHOT;
 
+extern DECLEXPORT(int) crServerVBoxWindowsShow(bool fShow);
 extern DECLEXPORT(int) crServerVBoxScreenshotGet(uint32_t u32Screen, uint32_t width, uint32_t height, uint32_t pitch, void *pvBuffer, CR_SCREENSHOT *pScreenshot);
 extern DECLEXPORT(void) crServerVBoxScreenshotRelease(CR_SCREENSHOT *pScreenshot);
Index: /trunk/src/VBox/HostServices/SharedOpenGL/crserver/crservice.cpp
===================================================================
--- /trunk/src/VBox/HostServices/SharedOpenGL/crserver/crservice.cpp	(revision 50393)
+++ /trunk/src/VBox/HostServices/SharedOpenGL/crserver/crservice.cpp	(revision 50394)
@@ -1445,4 +1445,27 @@
             break;
         }
+        case SHCRGL_HOST_FN_WINDOWS_SHOW:
+        {
+            /* Verify parameter count and types. */
+            if (cParms != 1)
+            {
+                WARN(("invalid parameter"));
+                rc = VERR_INVALID_PARAMETER;
+                break;
+            }
+
+            if (paParms[0].type != VBOX_HGCM_SVC_PARM_32BIT)
+            {
+                WARN(("invalid parameter"));
+                rc = VERR_INVALID_PARAMETER;
+                break;
+            }
+
+            rc = crServerVBoxWindowsShow(paParms[0].u.uint32);
+            if (!RT_SUCCESS(rc))
+                WARN(("crServerVBoxWindowsShow failed rc %d", rc));
+
+            break;
+        }
         default:
             rc = VERR_NOT_IMPLEMENTED;
Index: /trunk/src/VBox/HostServices/SharedOpenGL/crserverlib/server.h
===================================================================
--- /trunk/src/VBox/HostServices/SharedOpenGL/crserverlib/server.h	(revision 50393)
+++ /trunk/src/VBox/HostServices/SharedOpenGL/crserverlib/server.h	(revision 50394)
@@ -408,4 +408,5 @@
 int CrPMgrModeVrdp(bool fEnable);
 int CrPMgrModeRootVr(bool fEnable);
+int CrPMgrModeWinVisible(bool fEnable);
 int CrPMgrRootVrUpdate();
 int CrPMgrViewportUpdate(uint32_t idScreen);
Index: /trunk/src/VBox/HostServices/SharedOpenGL/crserverlib/server_muralfbo.cpp
===================================================================
--- /trunk/src/VBox/HostServices/SharedOpenGL/crserverlib/server_muralfbo.cpp	(revision 50393)
+++ /trunk/src/VBox/HostServices/SharedOpenGL/crserverlib/server_muralfbo.cpp	(revision 50394)
@@ -746,4 +746,9 @@
 
     return VINF_SUCCESS;
+}
+
+extern DECLEXPORT(int) crServerVBoxWindowsShow(bool fShow)
+{
+    return CrPMgrModeWinVisible(fShow);
 }
 
@@ -829,2 +834,3 @@
     Assert(mural->aidColorTexs[CR_SERVER_FBO_FB_IDX(mural)]);
 }
+
Index: /trunk/src/VBox/HostServices/SharedOpenGL/crserverlib/server_presenter.cpp
===================================================================
--- /trunk/src/VBox/HostServices/SharedOpenGL/crserverlib/server_presenter.cpp	(revision 50393)
+++ /trunk/src/VBox/HostServices/SharedOpenGL/crserverlib/server_presenter.cpp	(revision 50394)
@@ -136,4 +136,5 @@
     CR_FBMAP FramebufferInitMap;
     CR_FRAMEBUFFER aFramebuffers[CR_MAX_GUEST_MONITORS];
+    bool fWindowsForceHidden;
     uint32_t cbTmpBuf;
     void *pvTmpBuf;
@@ -2434,4 +2435,21 @@
     }
 
+    int winVisibilityChanged()
+    {
+        int rc = mpWindow->UpdateBegin();
+        if (RT_SUCCESS(rc))
+        {
+            rc = mpWindow->SetVisible(!g_CrPresenter.fWindowsForceHidden);
+            if (!RT_SUCCESS(rc))
+                WARN(("SetVisible failed, rc %d", rc));
+
+            mpWindow->UpdateEnd();
+        }
+        else
+            WARN(("UpdateBegin failed, rc %d", rc));
+
+        return rc;
+    }
+
 protected:
     virtual void onUpdateEnd()
@@ -2564,5 +2582,5 @@
         }
 
-        rc = mpWindow->SetVisible(true);
+        rc = mpWindow->SetVisible(!g_CrPresenter.fWindowsForceHidden);
         if (!RT_SUCCESS(rc))
         {
@@ -3820,4 +3838,26 @@
 }
 
+int CrPMgrModeWinVisible(bool fEnable)
+{
+    if (!g_CrPresenter.fWindowsForceHidden == !!fEnable)
+        return VINF_SUCCESS;
+
+    g_CrPresenter.fWindowsForceHidden = !fEnable;
+
+    for (HCR_FRAMEBUFFER hFb = CrPMgrFbGetFirstEnabled();
+            hFb;
+            hFb = CrPMgrFbGetNextEnabled(hFb))
+    {
+        uint32_t idScreen = CrFbGetScreenInfo(hFb)->u32ViewIndex;
+
+        CR_FBDISPLAY_INFO *pInfo = &g_CrPresenter.aDisplayInfos[idScreen];
+
+        if (pInfo->pDpWin)
+            pInfo->pDpWin->winVisibilityChanged();
+    }
+
+    return VINF_SUCCESS;
+}
+
 int CrPMgrRootVrUpdate()
 {
Index: /trunk/src/VBox/Main/include/DisplayImpl.h
===================================================================
--- /trunk/src/VBox/Main/include/DisplayImpl.h	(revision 50393)
+++ /trunk/src/VBox/Main/include/DisplayImpl.h	(revision 50394)
@@ -331,4 +331,7 @@
     bool        mfPendingVideoAccelEnable;
     bool        mfMachineRunning;
+#ifdef VBOX_WITH_CROGL
+    bool        mfCrOglDataHidden;
+#endif
 
     uint8_t    *mpu8VbvaPartial;
@@ -377,4 +380,8 @@
     void videoAccelFlush(void);
 
+#ifdef VBOX_WITH_CROGL
+    int crOglWindowsShow(bool fShow);
+#endif
+
 #ifdef VBOX_WITH_HGSMI
     volatile uint32_t mu32UpdateVBVAFlags;
Index: /trunk/src/VBox/Main/src-client/DisplayImpl.cpp
===================================================================
--- /trunk/src/VBox/Main/src-client/DisplayImpl.cpp	(revision 50393)
+++ /trunk/src/VBox/Main/src-client/DisplayImpl.cpp	(revision 50394)
@@ -116,4 +116,7 @@
 
     mfMachineRunning = false;
+#ifdef VBOX_WITH_CROGL
+    mfCrOglDataHidden = false;
+#endif
 
     mpu8VbvaPartial = NULL;
@@ -617,4 +620,39 @@
 }
 
+#ifdef VBOX_WITH_CROGL
+int Display::crOglWindowsShow(bool fShow)
+{
+    if (!mfCrOglDataHidden == !!fShow)
+        return VINF_SUCCESS;
+
+    VMMDev *pVMMDev = mParent->getVMMDev();
+    if (!pVMMDev)
+    {
+        AssertMsgFailed(("no vmmdev\n"));
+        return VERR_INVALID_STATE;
+    }
+
+    if (!mhCrOglSvc)
+    {
+        AssertMsgFailed(("no mhCrOglSvc\n"));
+        return VERR_INVALID_STATE;
+    }
+
+    VBOXHGCMSVCPARM parm;
+
+    parm.type = VBOX_HGCM_SVC_PARM_32BIT;
+    parm.u.uint32 = (uint32_t)fShow;
+
+    int rc = pVMMDev->hgcmHostFastCallAsync(mhCrOglSvc, SHCRGL_HOST_FN_WINDOWS_SHOW, &parm, NULL, NULL);
+    if (RT_SUCCESS(rc))
+        mfCrOglDataHidden = !fShow;
+    else
+        AssertMsgFailed(("hgcmHostFastCallAsync failed rc %n", rc));
+
+    return rc;
+}
+#endif
+
+
 // IEventListener method
 STDMETHODIMP Display::HandleEvent(IEvent * aEvent)
@@ -639,7 +677,18 @@
 
                 mfMachineRunning = true;
+
+#ifdef VBOX_WITH_CROGL
+                crOglWindowsShow(true);
+#endif
             }
             else
+            {
                 mfMachineRunning = false;
+
+#ifdef VBOX_WITH_CROGL
+                if (machineState == MachineState_Paused)
+                    crOglWindowsShow(false);
+#endif
+            }
             break;
         }
