diff --git a/src/keyboard.c b/src/keyboard.c
index 5298ce5..feab45c 100644
--- a/src/keyboard.c
+++ b/src/keyboard.c
@@ -39,13 +39,20 @@ void keyboard_hook_exit()
 
 LRESULT CALLBACK keyboard_hook_proc(int code, WPARAM wParam, LPARAM lParam)
 {
-    if (code < 0 || !wParam) // code != HC_ACTION || 
+    if (code < 0 || !wParam)
         return CallNextHookEx(g_keyboard_hook, code, wParam, lParam);
 
-    BOOL alt_down = (lParam & (1 << 29));
+    BOOL alt_down = !!(lParam & (1 << 29));
     BOOL key_down = !(lParam & (1 << 30));
     BOOL key_up = !!(lParam & (1 << 31));
 
+    //TRACE("VK_MENU - wParam=%u, key_down=%u, key_up=%u, alt_down=%u\n", wParam, key_down, key_up, alt_down);
+
+    if (wParam == VK_MENU && (key_up || key_down)) /* Fix for alt key being stuck on alt+tab in some games */
+    {
+        g_ddraw.alt_key_down = alt_down;
+    }
+
     if (wParam == g_config.hotkeys.toggle_fullscreen && alt_down)
     {
         if (key_down)
diff --git a/src/wndproc.c b/src/wndproc.c
index 2da7daf..0d65fce 100644
--- a/src/wndproc.c
+++ b/src/wndproc.c
@@ -707,7 +707,10 @@ LRESULT CALLBACK fake_WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam
             }
             
             if (wParam && g_ddraw.alt_key_down && !g_config.releasealt)
+            {
                 PostMessageA(g_ddraw.hwnd, WM_SYSKEYUP, VK_MENU, 0);
+                g_ddraw.alt_key_down = FALSE;
+            }
 
             return 0;
         }
@@ -758,20 +761,10 @@ LRESULT CALLBACK fake_WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam
     }
     case WM_SYSKEYDOWN:
     {
-        if (wParam == VK_MENU)
-        {
-            g_ddraw.alt_key_down = TRUE;
-        }
-
         break;
     }
     case WM_SYSKEYUP:
     {
-        if (wParam == VK_MENU)
-        {
-            g_ddraw.alt_key_down = FALSE;
-        }
-
         if (wParam == VK_TAB || (wParam && wParam == g_config.hotkeys.toggle_fullscreen))
         {
             return DefWindowProc(hWnd, uMsg, wParam, lParam);