Index: trunk/src/VBox/Additions/WINNT/Graphics/Video/mp/wddm/VBoxMPTypes.h
===================================================================
--- trunk/src/VBox/Additions/WINNT/Graphics/Video/mp/wddm/VBoxMPTypes.h	(revision 37873)
+++ trunk/src/VBox/Additions/WINNT/Graphics/Video/mp/wddm/VBoxMPTypes.h	(revision 37889)
@@ -70,4 +70,5 @@
 typedef struct _VBOXWDDM_GLOBAL_POINTER_INFO
 {
+    uint32_t iLastReportedScreen;
     uint32_t cVisible;
 } VBOXWDDM_GLOBAL_POINTER_INFO, *PVBOXWDDM_GLOBAL_POINTER_INFO;
Index: trunk/src/VBox/Additions/WINNT/Graphics/Video/mp/wddm/VBoxMPWddm.cpp
===================================================================
--- trunk/src/VBox/Additions/WINNT/Graphics/Video/mp/wddm/VBoxMPWddm.cpp	(revision 37873)
+++ trunk/src/VBox/Additions/WINNT/Graphics/Video/mp/wddm/VBoxMPWddm.cpp	(revision 37889)
@@ -3421,40 +3421,49 @@
     PVBOXWDDM_GLOBAL_POINTER_INFO pGlobalPointerInfo = &pDevExt->PointerInfo;
     PVIDEO_POINTER_ATTRIBUTES pPointerAttributes = &pPointerInfo->Attributes.data;
-    BOOLEAN bNotifyVisibility;
+    BOOLEAN fScreenVisState = !!(pPointerAttributes->Enable & VBOX_MOUSE_POINTER_VISIBLE);
+    BOOLEAN fVisStateChanged = FALSE;
+    BOOLEAN fScreenChanged = pGlobalPointerInfo->iLastReportedScreen != pSetPointerPosition->VidPnSourceId;
+
     if (pSetPointerPosition->Flags.Visible)
     {
-        bNotifyVisibility = (pGlobalPointerInfo->cVisible == 0);
-        if (!(pPointerAttributes->Enable & VBOX_MOUSE_POINTER_VISIBLE))
-        {
+        pPointerAttributes->Enable |= VBOX_MOUSE_POINTER_VISIBLE;
+        if (!fScreenVisState)
+        {
+            fVisStateChanged = !!pGlobalPointerInfo->cVisible;
             ++pGlobalPointerInfo->cVisible;
-            pPointerAttributes->Enable |= VBOX_MOUSE_POINTER_VISIBLE;
         }
     }
     else
     {
-        if (!!(pPointerAttributes->Enable & VBOX_MOUSE_POINTER_VISIBLE))
+        pPointerAttributes->Enable &= ~VBOX_MOUSE_POINTER_VISIBLE;
+        if (fScreenVisState)
         {
             --pGlobalPointerInfo->cVisible;
-            Assert(pGlobalPointerInfo->cVisible < UINT32_MAX/2);
-            pPointerAttributes->Enable &= ~VBOX_MOUSE_POINTER_VISIBLE;
-            bNotifyVisibility = (pGlobalPointerInfo->cVisible == 0);
-        }
-    }
-
-    pPointerAttributes->Column = pSetPointerPosition->X;
-    pPointerAttributes->Row = pSetPointerPosition->Y;
-
-    if (bNotifyVisibility && VBoxQueryHostWantsAbsolute())
-    {
-        // tell the host to use the guest's pointer
-        VIDEO_POINTER_ATTRIBUTES PointerAttributes;
-
-        /* Visible and No Shape means Show the pointer.
-         * It is enough to init only this field.
-         */
-        PointerAttributes.Enable = pSetPointerPosition->Flags.Visible ? VBOX_MOUSE_POINTER_VISIBLE : 0;
-
-        BOOLEAN bResult = VBoxMPCmnUpdatePointerShape(VBoxCommonFromDeviceExt(pDevExt), &PointerAttributes, sizeof (PointerAttributes));
-        Assert(bResult);
+            fVisStateChanged = !!pGlobalPointerInfo->cVisible;
+        }
+    }
+
+    pGlobalPointerInfo->iLastReportedScreen = pSetPointerPosition->VidPnSourceId;
+
+    if ((fVisStateChanged || fScreenChanged) && VBoxQueryHostWantsAbsolute())
+    {
+        if (fScreenChanged)
+        {
+            BOOLEAN bResult = VBoxMPCmnUpdatePointerShape(VBoxCommonFromDeviceExt(pDevExt), &pPointerInfo->Attributes.data, VBOXWDDM_POINTER_ATTRIBUTES_SIZE);
+            Assert(bResult);
+        }
+        else
+        {
+            // tell the host to use the guest's pointer
+            VIDEO_POINTER_ATTRIBUTES PointerAttributes;
+
+            /* Visible and No Shape means Show the pointer.
+             * It is enough to init only this field.
+             */
+            PointerAttributes.Enable = pSetPointerPosition->Flags.Visible ? VBOX_MOUSE_POINTER_VISIBLE : 0;
+
+            BOOLEAN bResult = VBoxMPCmnUpdatePointerShape(VBoxCommonFromDeviceExt(pDevExt), &PointerAttributes, sizeof (PointerAttributes));
+            Assert(bResult);
+        }
     }
 
@@ -3485,4 +3494,5 @@
         if (vboxVddmPointerShapeToAttributes(pSetPointerShape, pPointerInfo))
         {
+            pDevExt->PointerInfo.iLastReportedScreen = pSetPointerShape->VidPnSourceId;
             if (VBoxMPCmnUpdatePointerShape(VBoxCommonFromDeviceExt(pDevExt), &pPointerInfo->Attributes.data, VBOXWDDM_POINTER_ATTRIBUTES_SIZE))
                 Status = STATUS_SUCCESS;
