diff --git a/main.c b/main.c
index d93c4c4..ff6fcc2 100644
--- a/main.c
+++ b/main.c
@@ -349,6 +349,10 @@ LRESULT CALLBACK WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
             }
             return 0;
 
+        case WM_MOUSELEAVE:
+            mouse_unlock();
+            return 0;
+
         case WM_ACTIVATEAPP:
             /* C&C and RA stop drawing when they receive this with FALSE wParam, disable in windowed mode */
             if (ddraw->windowed)
@@ -406,6 +410,13 @@ LRESULT CALLBACK WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
                 fake_GetCursorPos(NULL); /* update our own cursor */
                 lParam = MAKELPARAM(ddraw->cursor.x, ddraw->cursor.y);
             }
+
+            if (ddraw->devmode)
+            {
+                mouse_lock();
+                ddraw->cursor.x = GET_X_LPARAM(lParam);
+                ddraw->cursor.y = GET_Y_LPARAM(lParam);
+            }
             break;
 
         /* make sure we redraw when WM_PAINT is requested */
@@ -457,10 +468,7 @@ HRESULT __stdcall ddraw_SetCooperativeLevel(IDirectDrawImpl *This, HWND hWnd, DW
         return DD_OK;
     }
 
-    if(!This->devmode)
-    {
-        SetWindowLong(This->hWnd, GWL_WNDPROC, (LONG)WndProc);
-    }
+    SetWindowLong(This->hWnd, GWL_WNDPROC, (LONG)WndProc);
 
     if(!This->render.hDC)
     {
diff --git a/mouse.c b/mouse.c
index f5e98f4..868f0e6 100644
--- a/mouse.c
+++ b/mouse.c
@@ -187,7 +187,13 @@ void mouse_lock()
 {
     RECT rc;
 
-    if(mouse_active && !ddraw->locked)
+    if (ddraw->devmode)
+    {
+        while(ShowCursor(FALSE) > 0);
+        return;
+    }
+
+    if (mouse_active && !ddraw->locked)
     {
         GetWindowRect(ddraw->hWnd, &rc);
         
@@ -208,6 +214,12 @@ void mouse_unlock()
     RECT rc;
     POINT pt;
 
+    if (ddraw->devmode)
+    {
+        while(ShowCursor(TRUE) < 0);
+        return;
+    }
+
     if(!mouse_active)
     {
         return;
@@ -236,7 +248,7 @@ void mouse_unlock()
 
 void mouse_init(HWND hWnd)
 {
-    if(ddraw->mhack)
+    if(ddraw->mhack || ddraw->devmode)
     {
         hack_iat(&hacks[0]);
         mouse_active = TRUE;