Backends: Win32: Fixed keyboard modifiers being reported when host window doesn't have focus. (#2622)
diff --git a/backends/imgui_impl_win32.cpp b/backends/imgui_impl_win32.cpp
index 4124b97..984171a 100644
--- a/backends/imgui_impl_win32.cpp
+++ b/backends/imgui_impl_win32.cpp
@@ -33,9 +33,10 @@
// CHANGELOG
// (minor and older changes stripped away, please see git history for details)
+// 2021-08-02: Inputs: Fixed keyboard modifiers being reported when host window doesn't have focus.
// 2021-07-29: Inputs: MousePos is correctly reported when the host platform window is hovered but not focused (using TrackMouseEvent() to receive WM_MOUSELEAVE events).
// 2021-06-29: Reorganized backend to pull data from a single structure to facilitate usage with multiple-contexts (all g_XXXX access changed to bd->XXXX).
-// 2021-06-08: Fix ImGui_ImplWin32_EnableDpiAwareness() and ImGui_ImplWin32_GetDpiScaleForMonitor() to handle Windows 8.1/10 features without a manifest (per-monitor DPI, and properly calls SetProcessDpiAwareness() on 8.1).
+// 2021-06-08: Fixed ImGui_ImplWin32_EnableDpiAwareness() and ImGui_ImplWin32_GetDpiScaleForMonitor() to handle Windows 8.1/10 features without a manifest (per-monitor DPI, and properly calls SetProcessDpiAwareness() on 8.1).
// 2021-03-23: Inputs: Clearing keyboard down array when losing focus (WM_KILLFOCUS).
// 2021-02-18: Added ImGui_ImplWin32_EnableAlphaCompositing(). Non Visual Studio users will need to link with dwmapi.lib (MinGW/gcc: use -ldwmapi).
// 2021-02-17: Fixed ImGui_ImplWin32_EnableDpiAwareness() attempting to get SetProcessDpiAwareness from shcore.dll on Windows 8 whereas it is only supported on Windows 8.1.
@@ -318,13 +319,6 @@
io.DeltaTime = (float)(current_time - bd->Time) / bd->TicksPerSecond;
bd->Time = current_time;
- // Read keyboard modifiers inputs
- io.KeyCtrl = (::GetKeyState(VK_CONTROL) & 0x8000) != 0;
- io.KeyShift = (::GetKeyState(VK_SHIFT) & 0x8000) != 0;
- io.KeyAlt = (::GetKeyState(VK_MENU) & 0x8000) != 0;
- io.KeySuper = false;
- // io.KeysDown[], io.MousePos, io.MouseDown[], io.MouseWheel: filled by the WndProc handler below.
-
// Update OS mouse position
ImGui_ImplWin32_UpdateMousePos();
@@ -422,17 +416,24 @@
io.MouseWheelH += (float)GET_WHEEL_DELTA_WPARAM(wParam) / (float)WHEEL_DELTA;
return 0;
case WM_KEYDOWN:
- case WM_SYSKEYDOWN:
- if (wParam < 256)
- io.KeysDown[wParam] = 1;
- return 0;
case WM_KEYUP:
+ case WM_SYSKEYDOWN:
case WM_SYSKEYUP:
+ {
+ bool down = (msg == WM_KEYDOWN || msg == WM_SYSKEYDOWN);
if (wParam < 256)
- io.KeysDown[wParam] = 0;
+ io.KeysDown[wParam] = down;
+ if (wParam == VK_CONTROL)
+ io.KeyCtrl = down;
+ if (wParam == VK_SHIFT)
+ io.KeyShift = down;
+ if (wParam == VK_MENU)
+ io.KeyAlt = down;
return 0;
+ }
case WM_KILLFOCUS:
memset(io.KeysDown, 0, sizeof(io.KeysDown));
+ io.KeyCtrl = io.KeyShift = io.KeyAlt = io.KeySuper = false;
return 0;
case WM_CHAR:
// You can also use ToAscii()+GetKeyboardState() to retrieve characters.
diff --git a/docs/CHANGELOG.txt b/docs/CHANGELOG.txt
index 91d146e..e20b016 100644
--- a/docs/CHANGELOG.txt
+++ b/docs/CHANGELOG.txt
@@ -98,6 +98,7 @@
- Backends: Win32: IME functions are disabled by default for non-Visual Studio compilers (MinGW etc.). Enable with
'#define IMGUI_ENABLE_WIN32_DEFAULT_IME_FUNCTIONS' for those compilers. Undo change from 1.82. (#2590, #738, #4185, #4301)
- Backends: Win32: Mouse position is correctly reported when the host window is hovered but not focused. (#2445, #2696, #3751, #4377)
+- Backends: Fixed keyboard modifiers being reported when host window doesn't have focus. (#2622)
- Backends: GLFW: Mouse position is correctly reported when the host window is hovered but not focused. (#3751, #4377, #2445)
(backend now uses glfwSetCursorEnterCallback(). If you called ImGui_ImplGlfw_InitXXX with install_callbacks=false, you will
need to install this callback and forward the data to the backend via ImGui_ImplGlfw_CursorEnterCallback).