Index: /trunk/src/VBox/Frontends/VirtualBox/src/globals/VBoxGlobal.cpp
===================================================================
--- /trunk/src/VBox/Frontends/VirtualBox/src/globals/VBoxGlobal.cpp	(revision 35905)
+++ /trunk/src/VBox/Frontends/VirtualBox/src/globals/VBoxGlobal.cpp	(revision 35906)
@@ -843,4 +843,57 @@
     return result;
 }
+
+#ifdef Q_WS_WIN
+/* Enumerate visible top-most windows: */
+BOOL CALLBACK EnumWindowsProc(HWND hWnd, LPARAM /* lParam */)
+{
+    /* Ignore NULL HWNDs: */
+    if (!hWnd)
+        return TRUE;
+
+    /* Ignore hidden windows: */
+    if (!IsWindowVisible(hWnd))
+        return TRUE;
+
+    /* Get window style: */
+    LONG uStyle = GetWindowLong(hWnd, GWL_STYLE);
+    /* Ignore minimized windows: */
+    if (uStyle & WS_MINIMIZE)
+        return TRUE;
+
+    /* Get extended window style: */
+    LONG uExtendedStyle = GetWindowLong(hWnd, GWL_EXSTYLE);
+    /* Ignore non-top-most windows: */
+    if (!(uExtendedStyle & WS_EX_TOPMOST))
+        return TRUE;
+
+    /* Get that window rectangle: */
+    RECT rect;
+    GetWindowRect(hWnd, &rect);
+    VBoxGlobal::m_sTopMostRects << QRect(QPoint(rect.left, rect.top), QPoint(rect.right - 1, rect.bottom - 1));
+
+    /* Proceed to the next window: */
+    return TRUE;
+}
+
+/* static */
+QList<QRect> VBoxGlobal::m_sTopMostRects = QList<QRect>();
+
+/* static */
+const QRegion VBoxGlobal::areaCoveredByTopMostWindows()
+{
+    /* Prepare the top-most region: */
+    QRegion topMostRegion;
+    /* Initialize the list of the top-most rectangles: */
+    m_sTopMostRects.clear();
+    /* Populate the list of top-most rectangles: */
+    EnumWindows((WNDENUMPROC)EnumWindowsProc, 0);
+    /* Update the top-most region with top-most rectangles: */
+    for (int iRectIndex = 0; iRectIndex < m_sTopMostRects.size(); ++iRectIndex)
+        topMostRegion += m_sTopMostRects[iRectIndex];
+    /* Return top-most region: */
+    return topMostRegion;
+}
+#endif /* Q_WS_WIN */
 
 /**
Index: /trunk/src/VBox/Frontends/VirtualBox/src/globals/VBoxGlobal.h
===================================================================
--- /trunk/src/VBox/Frontends/VirtualBox/src/globals/VBoxGlobal.h	(revision 35905)
+++ /trunk/src/VBox/Frontends/VirtualBox/src/globals/VBoxGlobal.h	(revision 35906)
@@ -178,4 +178,9 @@
     const QRect availableGeometry(int iScreen = 0) const;
 
+#ifdef Q_WS_WIN
+    static QList<QRect> m_sTopMostRects;
+    static const QRegion areaCoveredByTopMostWindows();
+#endif /* Q_WS_WIN */
+
 #ifdef VBOX_WITH_DEBUGGER_GUI
     bool isDebuggerEnabled(CMachine &aMachine);
Index: /trunk/src/VBox/Frontends/VirtualBox/src/runtime/UIMouseHandler.cpp
===================================================================
--- /trunk/src/VBox/Frontends/VirtualBox/src/runtime/UIMouseHandler.cpp	(revision 35905)
+++ /trunk/src/VBox/Frontends/VirtualBox/src/runtime/UIMouseHandler.cpp	(revision 35906)
@@ -692,12 +692,9 @@
         /* Bringing mouse to the opposite side to simulate the endless moving: */
 
-        /* Acquiring visible viewport rectangle in local coordinates: */
-        QRect viewportRectangle = m_viewports[uScreenId]->visibleRegion().boundingRect();
+        /* Get visible-viewport-rectangle in global coordinates: */
+        QRect viewportRectangle = m_mouseCursorClippingRect;
+        /* Get top-left point of full-viewport-rectangle in global coordinates: */
         QPoint viewportRectangleGlobalPos = m_views[uScreenId]->mapToGlobal(m_viewports[uScreenId]->pos());
-        /* Shift viewport rectangle to global position to bound by available geometry: */
-        viewportRectangle.translate(viewportRectangleGlobalPos);
-        /* Acquiring viewport rectangle cropped by available geometry: */
-        viewportRectangle = viewportRectangle.intersected(QApplication::desktop()->availableGeometry());
-        /* Shift remaining viewport rectangle to local position as relative position is in local coordinates: */
+        /* Shift visible-viewport-rectangle to local position because relative position is in local coordinates: */
         viewportRectangle.translate(-viewportRectangleGlobalPos);
 
@@ -873,11 +870,33 @@
     if (uisession()->isMouseCaptured())
     {
-        /* Acquiring visible viewport rectangle: */
+        /* Get full-viewport-rectangle in local coordinates: */
         QRect viewportRectangle = m_viewports[m_iMouseCaptureViewIndex]->visibleRegion().boundingRect();
+        /* Get top-left point of full-viewport-rectangle in global coordinates: */
         QPoint viewportRectangleGlobalPos = m_views[m_iMouseCaptureViewIndex]->mapToGlobal(m_viewports[m_iMouseCaptureViewIndex]->pos());
+        /* Get full-viewport-rectangle in global coordinates: */
         viewportRectangle.translate(viewportRectangleGlobalPos);
+        /* Trim full-viewport-rectangle by available geometry: */
         viewportRectangle = viewportRectangle.intersected(QApplication::desktop()->availableGeometry());
+        /* Trim partial-viewport-rectangle by top-most windows: */
+        QRegion viewportRegion(viewportRectangle);
+        QRegion topMostRegion(VBoxGlobal::areaCoveredByTopMostWindows());
+        viewportRegion -= topMostRegion;
+        /* Check if partial-viewport-region consists of 1 rectangle: */
+        if (viewportRegion.rectCount() > 1)
+        {
+            /* Choose the largest rectangle: */
+            QVector<QRect> rects = viewportRegion.rects();
+            QRect largestRect;
+            for (int i = 0; i < rects.size(); ++i)
+                largestRect = largestRect.width() * largestRect.height() < rects[i].width() * rects[i].height() ? rects[i] : largestRect;
+            /* Assign the partial-viewport-region to the largest rect: */
+            viewportRegion = largestRect;
+        }
+        /* Assign the partial-viewport-rectangle to the partial-viewport-region: */
+        viewportRectangle = viewportRegion.boundingRect();
+        /* Assign the visible-viewport-rectangle to the partial-viewport-rectangle: */
+        m_mouseCursorClippingRect = viewportRectangle;
         /* Prepare clipping area: */
-        RECT rect = { viewportRectangle.left() + 1, viewportRectangle.top() + 1, viewportRectangle.right(), viewportRectangle.bottom() };
+        RECT rect = { m_mouseCursorClippingRect.left() + 1, m_mouseCursorClippingRect.top() + 1, m_mouseCursorClippingRect.right(), m_mouseCursorClippingRect.bottom() };
         ::ClipCursor(&rect);
     }
Index: /trunk/src/VBox/Frontends/VirtualBox/src/runtime/UIMouseHandler.h
===================================================================
--- /trunk/src/VBox/Frontends/VirtualBox/src/runtime/UIMouseHandler.h	(revision 35905)
+++ /trunk/src/VBox/Frontends/VirtualBox/src/runtime/UIMouseHandler.h	(revision 35906)
@@ -24,4 +24,5 @@
 #include <QPoint>
 #include <QMap>
+#include <QRect>
 
 /* Local includes */
@@ -110,4 +111,5 @@
      * we do not really grab the mouse in case of capturing it: */
     void updateMouseCursorClipping();
+    QRect m_mouseCursorClippingRect;
 #endif /* Q_WS_WIN */
 
