diff --git a/src/java/org/lwjgl/opengl/WindowsDisplay.java b/src/java/org/lwjgl/opengl/WindowsDisplay.java index 2fdcefe7..74245a06 100644 --- a/src/java/org/lwjgl/opengl/WindowsDisplay.java +++ b/src/java/org/lwjgl/opengl/WindowsDisplay.java @@ -706,7 +706,17 @@ final class WindowsDisplay implements DisplayImplementation { return true; case WM_SYSKEYDOWN: /* Fall through */ case WM_SYSKEYUP: /* Fall through */ - case WM_KEYUP: /* Fall through */ + case WM_KEYUP: + // SysRq apparently only generates WM_KEYUP, so we'll fake a WM_KEYDOWN + if (wParam == WindowsKeycodes.VK_SNAPSHOT && keyboard != null && + !keyboard.isKeyDown(org.lwjgl.input.Keyboard.KEY_SYSRQ)) { + // Set key state to pressed + long fake_lparam = lParam & ~(1 << 31); + // Set key previous state to released + fake_lparam = fake_lparam & ~(1 << 30); + handleKeyButton(wParam, fake_lparam, millis); + } + /* Fall through */ case WM_KEYDOWN: handleKeyButton(wParam, lParam, millis); return false; diff --git a/src/java/org/lwjgl/opengl/WindowsKeyboard.java b/src/java/org/lwjgl/opengl/WindowsKeyboard.java index 14376fd9..6ce657e8 100644 --- a/src/java/org/lwjgl/opengl/WindowsKeyboard.java +++ b/src/java/org/lwjgl/opengl/WindowsKeyboard.java @@ -74,6 +74,10 @@ final class WindowsKeyboard { public void destroy() { } + boolean isKeyDown(int lwjgl_keycode) { + return key_down_buffer[lwjgl_keycode] == 1; + } + public void grab(boolean grab) { if(grab) { if (!grabbed) { diff --git a/src/java/org/lwjgl/opengl/WindowsKeycodes.java b/src/java/org/lwjgl/opengl/WindowsKeycodes.java index 49d1f5e9..25c97086 100644 --- a/src/java/org/lwjgl/opengl/WindowsKeycodes.java +++ b/src/java/org/lwjgl/opengl/WindowsKeycodes.java @@ -534,7 +534,7 @@ final class WindowsKeycodes { return Keyboard.KEY_NUMPADCOMMA; case VK_DIVIDE: return Keyboard.KEY_DIVIDE; - case VK_PRINT: + case VK_SNAPSHOT: return Keyboard.KEY_SYSRQ; case VK_RMENU: return Keyboard.KEY_RMENU;