Index: /trunk/src/VBox/Main/include/MouseImpl.h
===================================================================
--- /trunk/src/VBox/Main/include/MouseImpl.h	(revision 35870)
+++ /trunk/src/VBox/Main/include/MouseImpl.h	(revision 35871)
@@ -130,4 +130,9 @@
     const ComObjPtr<EventSource> mEventSource;
     VBoxEventDesc                mMouseEvent;
+
+    void fireMouseEvent(bool fAbsolute, LONG x, LONG y, LONG dz, LONG dw, LONG Buttons);
+#else
+    void fireMouseEvent(bool fAbsolute, LONG x, LONG y, LONG dz, LONG dw, LONG Buttons)
+    {}
 #endif
 };
Index: /trunk/src/VBox/Main/src-client/MouseImpl.cpp
===================================================================
--- /trunk/src/VBox/Main/src-client/MouseImpl.cpp	(revision 35870)
+++ /trunk/src/VBox/Main/src-client/MouseImpl.cpp	(revision 35871)
@@ -405,4 +405,24 @@
 }
 
+#ifndef VBOXBFE_WITHOUT_COM
+void Mouse::fireMouseEvent(bool fAbsolute, LONG x, LONG y, LONG dz, LONG dw, LONG Buttons)
+{
+    /* If mouse button is pressed, we generate new event, to avoid reusable events coalescing and thus
+       dropping key press events */
+    if (Buttons != 0)
+    {
+        VBoxEventDesc evDesc;
+        evDesc.init(mEventSource, VBoxEventType_OnGuestMouse, fAbsolute, x, y, dz, dw, Buttons);
+        evDesc.fire(0);
+    }
+    else
+    {
+        mMouseEvent.reinit(VBoxEventType_OnGuestMouse, fAbsolute, x, y, dz, dw, Buttons);
+        mMouseEvent.fire(0);
+    }
+}
+#endif
+
+
 /**
  * Send a relative mouse event to the guest.
@@ -433,8 +453,5 @@
     rc = reportRelEventToMouseDev(dx, dy, dz, dw, fButtons);
 
-#ifndef VBOXBFE_WITHOUT_COM
-    mMouseEvent.reinit(VBoxEventType_OnGuestMouse, false, dx, dy, dz, dw, fButtons);
-    mMouseEvent.fire(0);
-#endif
+    fireMouseEvent(false, dx, dy, dz, dw, buttonState);
 
     return rc;
@@ -538,9 +555,5 @@
                                     & VMMDEV_MOUSE_NEW_PROTOCOL));
 
-#ifndef VBOXBFE_WITHOUT_COM
-        mMouseEvent.reinit(VBoxEventType_OnGuestMouse, true, x, y, dz, dw,
-                           fButtons);
-        mMouseEvent.fire(0);
-#endif
+        fireMouseEvent(true, x, y, dz, dw, buttonState);
     }
 
