diff --git a/inc/dd.h b/inc/dd.h
index 762bace..2a5a766 100644
--- a/inc/dd.h
+++ b/inc/dd.h
@@ -12,7 +12,7 @@ ULONG dd_AddRef();
 ULONG dd_Release();
 HRESULT dd_EnumDisplayModes(DWORD dwFlags, LPDDSURFACEDESC lpDDSurfaceDesc, LPVOID lpContext, LPDDENUMMODESCALLBACK lpEnumModesCallback);
 HRESULT dd_WaitForVerticalBlank(DWORD dwFlags, HANDLE h);
-HRESULT dd_SetDisplayMode(DWORD width, DWORD height, DWORD bpp);
+HRESULT dd_SetDisplayMode(DWORD width, DWORD height, DWORD bpp, BOOL set_by_game);
 HRESULT dd_SetCooperativeLevel(HWND hwnd, DWORD dwFlags);
 HRESULT dd_RestoreDisplayMode();
 HRESULT dd_GetCaps(LPDDCAPS lpDDDriverCaps, LPDDCAPS lpDDEmulCaps);
@@ -107,7 +107,6 @@ typedef struct cnc_ddraw
     BOOL hidecursor;
     BOOL accurate_timers;
     BOOL resizable;
-    BOOL sierrahack;
     BOOL nonexclusive;
     BOOL fixpitch;
     BOOL fixchildwindows;
diff --git a/inc/wndproc.h b/inc/wndproc.h
index 85cad2b..6d2a199 100644
--- a/inc/wndproc.h
+++ b/inc/wndproc.h
@@ -4,6 +4,9 @@
 #define WM_AUTORENDERER WM_APP+111
 #define WM_WINEFULLSCREEN WM_APP+112
 #define WM_D3D9DEVICELOST WM_APP+113
+#define WM_SIZE_DDRAW WM_APP+114
+#define WM_MOVE_DDRAW WM_APP+115
+#define WM_DISPLAYCHANGE_DDRAW WM_APP+116
 
 #define IDT_TIMER_LEAVE_BNET 541287654
 
diff --git a/src/IDirectDraw/IDirectDraw.c b/src/IDirectDraw/IDirectDraw.c
index 338238d..9664869 100644
--- a/src/IDirectDraw/IDirectDraw.c
+++ b/src/IDirectDraw/IDirectDraw.c
@@ -316,7 +316,7 @@ HRESULT __stdcall IDirectDraw__SetCooperativeLevel(IDirectDrawImpl* This, HWND h
 HRESULT __stdcall IDirectDraw__SetDisplayMode(IDirectDrawImpl* This, DWORD width, DWORD height, DWORD bpp)
 {
     dprintf("-> %s(This=%p, width=%d, height=%d, bpp=%d)\n", __FUNCTION__, This, (unsigned int)width, (unsigned int)height, (unsigned int)bpp);
-    HRESULT ret = dd_SetDisplayMode(width, height, bpp);
+    HRESULT ret = dd_SetDisplayMode(width, height, bpp, TRUE);
     dprintf("<- %s\n", __FUNCTION__);
     return ret;
 }
@@ -324,7 +324,7 @@ HRESULT __stdcall IDirectDraw__SetDisplayMode(IDirectDrawImpl* This, DWORD width
 HRESULT __stdcall IDirectDraw__SetDisplayModeX(IDirectDrawImpl* This, DWORD width, DWORD height, DWORD bpp, DWORD refreshRate, DWORD flags)
 {
     dprintf("-> %s(This=%p, width=%d, height=%d, bpp=%d, refreshRate=%d, flags=%d)\n", __FUNCTION__, This, (unsigned int)width, (unsigned int)height, (unsigned int)bpp, (unsigned int)refreshRate, (unsigned int)flags);
-    HRESULT ret = dd_SetDisplayMode(width, height, bpp);
+    HRESULT ret = dd_SetDisplayMode(width, height, bpp, TRUE);
     dprintf("<- %s\n", __FUNCTION__);
     return ret;
 }
diff --git a/src/config.c b/src/config.c
index f559f6c..e1e63d6 100644
--- a/src/config.c
+++ b/src/config.c
@@ -54,7 +54,6 @@ void cfg_load()
     g_ddraw->d3d9linear = cfg_get_bool("d3d9linear", TRUE);
     g_ddraw->backbuffer = cfg_get_bool("backbuffer", TRUE);
     g_ddraw->passthrough = cfg_get_bool("passthrough", TRUE);
-    g_ddraw->sierrahack = cfg_get_bool("sierrahack", FALSE); // Sierra Caesar III, Pharaoh, and Zeus hack
 
     g_config.window_rect.right = cfg_get_int("width", 0);
     g_config.window_rect.bottom = cfg_get_int("height", 0);
@@ -501,17 +500,14 @@ static void cfg_create_ini()
             "; Caesar III\n"
             "[c3]\n"
             "handlemouse=false\n"
-            "sierrahack=true\n"
             "\n"
             "; Pharaoh\n"
             "[Pharaoh]\n"
             "handlemouse=false\n"
-            "sierrahack=true\n"
             "\n"
             "; Master of Olympus - Zeus\n"
             "[Zeus]\n"
             "handlemouse=false\n"
-            "sierrahack=true\n"
             "renderer=gdi\n"
             "hook=2\n"
             "\n"
diff --git a/src/dd.c b/src/dd.c
index 3c8655c..f5f0380 100644
--- a/src/dd.c
+++ b/src/dd.c
@@ -294,7 +294,7 @@ HRESULT dd_RestoreDisplayMode()
     return DD_OK;
 }
 
-HRESULT dd_SetDisplayMode(DWORD width, DWORD height, DWORD bpp)
+HRESULT dd_SetDisplayMode(DWORD width, DWORD height, DWORD bpp, BOOL set_by_game)
 {
     if (bpp != 8 && bpp != 16 && bpp != 32)
         return DDERR_INVALIDMODE;
@@ -644,7 +644,7 @@ HRESULT dd_SetDisplayMode(DWORD width, DWORD height, DWORD bpp)
         {
             g_ddraw->render.run = FALSE;
             g_ddraw->windowed = TRUE;
-            return dd_SetDisplayMode(width, height, bpp);
+            return dd_SetDisplayMode(width, height, bpp, FALSE);
         }
 
         if (g_ddraw->wine)
@@ -672,10 +672,11 @@ HRESULT dd_SetDisplayMode(DWORD width, DWORD height, DWORD bpp)
         g_ddraw->render.thread = CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)g_ddraw->renderer, NULL, 0, NULL);
     }
 
-    if (g_ddraw->sierrahack)
+    if (set_by_game)
     {
-        PostMessageA(g_ddraw->hwnd, WM_MOVE, 0, MAKELPARAM(-32000, -32000));
-        PostMessageA(g_ddraw->hwnd, WM_DISPLAYCHANGE, g_ddraw->bpp, MAKELPARAM(g_ddraw->width, g_ddraw->height));
+        //real_SendMessageA(g_ddraw->hwnd, WM_SIZE_DDRAW, 0, MAKELPARAM(g_ddraw->width, g_ddraw->height));
+        real_SendMessageA(g_ddraw->hwnd, WM_MOVE_DDRAW, 0, MAKELPARAM(0, 0));
+        real_SendMessageA(g_ddraw->hwnd, WM_DISPLAYCHANGE_DDRAW, g_ddraw->bpp, MAKELPARAM(g_ddraw->width, g_ddraw->height));
     }
 
     return DD_OK;
diff --git a/src/utils.c b/src/utils.c
index 918269d..4b36c7a 100644
--- a/src/utils.c
+++ b/src/utils.c
@@ -231,7 +231,7 @@ void util_toggle_fullscreen()
         g_config.window_state = g_ddraw->windowed = FALSE;
         real_SetWindowLongA(g_ddraw->hwnd, GWL_STYLE, GetWindowLong(g_ddraw->hwnd, GWL_STYLE) & ~(WS_CAPTION | WS_THICKFRAME | WS_MINIMIZE | WS_MAXIMIZE | WS_SYSMENU));
         g_ddraw->altenter = TRUE;
-        dd_SetDisplayMode(g_ddraw->width, g_ddraw->height, g_ddraw->bpp);
+        dd_SetDisplayMode(g_ddraw->width, g_ddraw->height, g_ddraw->bpp, FALSE);
         util_update_bnet_pos(0, 0);
 
         mouse_lock();
@@ -250,7 +250,7 @@ void util_toggle_fullscreen()
             ChangeDisplaySettings(NULL, g_ddraw->bnet_active ? CDS_FULLSCREEN : 0);
         }
 
-        dd_SetDisplayMode(g_ddraw->width, g_ddraw->height, g_ddraw->bpp);
+        dd_SetDisplayMode(g_ddraw->width, g_ddraw->height, g_ddraw->bpp, FALSE);
         mouse_lock();
     }
 }
@@ -300,7 +300,7 @@ void util_set_window_rect(int x, int y, int width, int height, UINT flags)
             g_config.window_rect.right = width;
         }
 
-        dd_SetDisplayMode(g_ddraw->width, g_ddraw->height, g_ddraw->bpp);
+        dd_SetDisplayMode(g_ddraw->width, g_ddraw->height, g_ddraw->bpp, FALSE);
     }
 }
 
diff --git a/src/wndproc.c b/src/wndproc.c
index 4d5a5e3..22b0ef8 100644
--- a/src/wndproc.c
+++ b/src/wndproc.c
@@ -39,6 +39,7 @@ LRESULT CALLBACK fake_WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam
         case WM_NCLBUTTONUP:
         case WM_NCPAINT:
         case WM_CANCELMODE:
+        case WM_DISPLAYCHANGE:
         {
             return DefWindowProc(hWnd, uMsg, wParam, lParam);
         }
@@ -110,6 +111,21 @@ LRESULT CALLBACK fake_WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam
 
             break;
         }
+        case WM_SIZE_DDRAW:
+        {
+            uMsg = WM_SIZE;
+            break;
+        }
+        case WM_MOVE_DDRAW:
+        {
+            uMsg = WM_MOVE;
+            break;
+        }
+        case WM_DISPLAYCHANGE_DDRAW:
+        {
+            uMsg = WM_DISPLAYCHANGE;
+            break;
+        }
         case WM_D3D9DEVICELOST:
         {
             if (g_ddraw->renderer == d3d9_render_main && d3d9_on_device_lost())
@@ -187,7 +203,7 @@ LRESULT CALLBACK fake_WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam
                 in_size_move = FALSE;
 
                 if (!g_ddraw->render.thread)
-                    dd_SetDisplayMode(g_ddraw->width, g_ddraw->height, g_ddraw->bpp);
+                    dd_SetDisplayMode(g_ddraw->width, g_ddraw->height, g_ddraw->bpp, FALSE);
             }
             break;
         }
@@ -369,12 +385,6 @@ LRESULT CALLBACK fake_WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam
             if (!g_ddraw->handlemouse)
                 RedrawWindow(hWnd, NULL, NULL, RDW_INVALIDATE | RDW_ALLCHILDREN);
 
-            if (g_ddraw->sierrahack)
-            {
-                lParam = 0;
-                break;
-            }
-
             return DefWindowProc(hWnd, uMsg, wParam, lParam); /* Carmageddon fix */
         }