From 7f9bca43c5e2ae81c18809ae60c0e09c08e30926 Mon Sep 17 00:00:00 2001 From: "jonathan.r.paton@googlemail.com" Date: Thu, 28 Sep 2017 20:28:42 +0100 Subject: [PATCH] Initial Windows implementation --- src/SFML/Window/Win32/InputImpl.cpp | 288 ++++++++++++++-------- src/SFML/Window/Win32/InputImpl.hpp | 7 +- src/SFML/Window/Win32/WindowImplWin32.cpp | 129 ++++++++-- src/SFML/Window/Win32/WindowImplWin32.hpp | 22 +- 4 files changed, 321 insertions(+), 125 deletions(-) mode change 100755 => 100644 src/SFML/Window/Win32/WindowImplWin32.cpp diff --git a/src/SFML/Window/Win32/InputImpl.cpp b/src/SFML/Window/Win32/InputImpl.cpp index 5f4e993c..07ccef37 100644 --- a/src/SFML/Window/Win32/InputImpl.cpp +++ b/src/SFML/Window/Win32/InputImpl.cpp @@ -45,116 +45,45 @@ namespace priv //////////////////////////////////////////////////////////// bool InputImpl::isKeyPressed(Keyboard::Key key) { - int vkey = 0; - switch (key) - { - default: vkey = 0; break; - case Keyboard::A: vkey = 'A'; break; - case Keyboard::B: vkey = 'B'; break; - case Keyboard::C: vkey = 'C'; break; - case Keyboard::D: vkey = 'D'; break; - case Keyboard::E: vkey = 'E'; break; - case Keyboard::F: vkey = 'F'; break; - case Keyboard::G: vkey = 'G'; break; - case Keyboard::H: vkey = 'H'; break; - case Keyboard::I: vkey = 'I'; break; - case Keyboard::J: vkey = 'J'; break; - case Keyboard::K: vkey = 'K'; break; - case Keyboard::L: vkey = 'L'; break; - case Keyboard::M: vkey = 'M'; break; - case Keyboard::N: vkey = 'N'; break; - case Keyboard::O: vkey = 'O'; break; - case Keyboard::P: vkey = 'P'; break; - case Keyboard::Q: vkey = 'Q'; break; - case Keyboard::R: vkey = 'R'; break; - case Keyboard::S: vkey = 'S'; break; - case Keyboard::T: vkey = 'T'; break; - case Keyboard::U: vkey = 'U'; break; - case Keyboard::V: vkey = 'V'; break; - case Keyboard::W: vkey = 'W'; break; - case Keyboard::X: vkey = 'X'; break; - case Keyboard::Y: vkey = 'Y'; break; - case Keyboard::Z: vkey = 'Z'; break; - case Keyboard::Num0: vkey = '0'; break; - case Keyboard::Num1: vkey = '1'; break; - case Keyboard::Num2: vkey = '2'; break; - case Keyboard::Num3: vkey = '3'; break; - case Keyboard::Num4: vkey = '4'; break; - case Keyboard::Num5: vkey = '5'; break; - case Keyboard::Num6: vkey = '6'; break; - case Keyboard::Num7: vkey = '7'; break; - case Keyboard::Num8: vkey = '8'; break; - case Keyboard::Num9: vkey = '9'; break; - case Keyboard::Escape: vkey = VK_ESCAPE; break; - case Keyboard::LControl: vkey = VK_LCONTROL; break; - case Keyboard::LShift: vkey = VK_LSHIFT; break; - case Keyboard::LAlt: vkey = VK_LMENU; break; - case Keyboard::LSystem: vkey = VK_LWIN; break; - case Keyboard::RControl: vkey = VK_RCONTROL; break; - case Keyboard::RShift: vkey = VK_RSHIFT; break; - case Keyboard::RAlt: vkey = VK_RMENU; break; - case Keyboard::RSystem: vkey = VK_RWIN; break; - case Keyboard::Menu: vkey = VK_APPS; break; - case Keyboard::LBracket: vkey = VK_OEM_4; break; - case Keyboard::RBracket: vkey = VK_OEM_6; break; - case Keyboard::Semicolon: vkey = VK_OEM_1; break; - case Keyboard::Comma: vkey = VK_OEM_COMMA; break; - case Keyboard::Period: vkey = VK_OEM_PERIOD; break; - case Keyboard::Quote: vkey = VK_OEM_7; break; - case Keyboard::Slash: vkey = VK_OEM_2; break; - case Keyboard::Backslash: vkey = VK_OEM_5; break; - case Keyboard::Tilde: vkey = VK_OEM_3; break; - case Keyboard::Equal: vkey = VK_OEM_PLUS; break; - case Keyboard::Hyphen: vkey = VK_OEM_MINUS; break; - case Keyboard::Space: vkey = VK_SPACE; break; - case Keyboard::Enter: vkey = VK_RETURN; break; - case Keyboard::Backspace: vkey = VK_BACK; break; - case Keyboard::Tab: vkey = VK_TAB; break; - case Keyboard::PageUp: vkey = VK_PRIOR; break; - case Keyboard::PageDown: vkey = VK_NEXT; break; - case Keyboard::End: vkey = VK_END; break; - case Keyboard::Home: vkey = VK_HOME; break; - case Keyboard::Insert: vkey = VK_INSERT; break; - case Keyboard::Delete: vkey = VK_DELETE; break; - case Keyboard::Add: vkey = VK_ADD; break; - case Keyboard::Subtract: vkey = VK_SUBTRACT; break; - case Keyboard::Multiply: vkey = VK_MULTIPLY; break; - case Keyboard::Divide: vkey = VK_DIVIDE; break; - case Keyboard::Left: vkey = VK_LEFT; break; - case Keyboard::Right: vkey = VK_RIGHT; break; - case Keyboard::Up: vkey = VK_UP; break; - case Keyboard::Down: vkey = VK_DOWN; break; - case Keyboard::Numpad0: vkey = VK_NUMPAD0; break; - case Keyboard::Numpad1: vkey = VK_NUMPAD1; break; - case Keyboard::Numpad2: vkey = VK_NUMPAD2; break; - case Keyboard::Numpad3: vkey = VK_NUMPAD3; break; - case Keyboard::Numpad4: vkey = VK_NUMPAD4; break; - case Keyboard::Numpad5: vkey = VK_NUMPAD5; break; - case Keyboard::Numpad6: vkey = VK_NUMPAD6; break; - case Keyboard::Numpad7: vkey = VK_NUMPAD7; break; - case Keyboard::Numpad8: vkey = VK_NUMPAD8; break; - case Keyboard::Numpad9: vkey = VK_NUMPAD9; break; - case Keyboard::F1: vkey = VK_F1; break; - case Keyboard::F2: vkey = VK_F2; break; - case Keyboard::F3: vkey = VK_F3; break; - case Keyboard::F4: vkey = VK_F4; break; - case Keyboard::F5: vkey = VK_F5; break; - case Keyboard::F6: vkey = VK_F6; break; - case Keyboard::F7: vkey = VK_F7; break; - case Keyboard::F8: vkey = VK_F8; break; - case Keyboard::F9: vkey = VK_F9; break; - case Keyboard::F10: vkey = VK_F10; break; - case Keyboard::F11: vkey = VK_F11; break; - case Keyboard::F12: vkey = VK_F12; break; - case Keyboard::F13: vkey = VK_F13; break; - case Keyboard::F14: vkey = VK_F14; break; - case Keyboard::F15: vkey = VK_F15; break; - case Keyboard::Pause: vkey = VK_PAUSE; break; - } - - return (GetAsyncKeyState(vkey) & 0x8000) != 0; + return isKeyPressed(unlocalize(key)); } +//////////////////////////////////////////////////////////// +bool InputImpl::isKeyPressed(Keyboard::Scancode code) +{ + auto winCode = sfScanToWin(code); + auto vkey = MapVirtualKey(winCode, MAPVK_VSC_TO_VK_EX); + auto state = GetAsyncKeyState(vkey); + return (state & 0x8000) != 0; +} + +//////////////////////////////////////////////////////////// +Keyboard::Key InputImpl::localize(Keyboard::Scancode code) +{ + // TODO + return sf::Keyboard::Unknown; +} + +//////////////////////////////////////////////////////////// +Keyboard::Scancode InputImpl::unlocalize(Keyboard::Key code) +{ + // TODO + return sf::Keyboard::ScanUnknown; +} + +//////////////////////////////////////////////////////////// +String InputImpl::getDescription(Keyboard::Scancode code) +{ + LONG lparam = sfScanToWin(code); + const int bufSize(1024); + WCHAR name[bufSize]; + int result = GetKeyNameText(lparam, name, bufSize); + if (result > 0) + { + return name; + } + return "Unknown"; +} //////////////////////////////////////////////////////////// void InputImpl::setVirtualKeyboardVisible(bool visible) @@ -251,6 +180,149 @@ Vector2i InputImpl::getTouchPosition(unsigned int /*finger*/, const WindowBase& return Vector2i(); } +//////////////////////////////////////////////////////////// +LONG InputImpl::sfScanToWin(Keyboard::Scancode code) +{ + // Windows scan codes + // Reference: https://msdn.microsoft.com/en-us/library/aa299374(v=vs.60).aspx + switch (code) + { + case Keyboard::ScanA: return 30; + case Keyboard::ScanB: return 48; + case Keyboard::ScanC: return 46; + case Keyboard::ScanD: return 32; + case Keyboard::ScanE: return 18; + case Keyboard::ScanF: return 33; + case Keyboard::ScanG: return 34; + case Keyboard::ScanH: return 35; + case Keyboard::ScanI: return 23; + case Keyboard::ScanJ: return 36; + case Keyboard::ScanK: return 37; + case Keyboard::ScanL: return 38; + case Keyboard::ScanM: return 50; + case Keyboard::ScanN: return 49; + case Keyboard::ScanO: return 24; + case Keyboard::ScanP: return 25; + case Keyboard::ScanQ: return 16; + case Keyboard::ScanR: return 19; + case Keyboard::ScanS: return 31; + case Keyboard::ScanT: return 20; + case Keyboard::ScanU: return 22; + case Keyboard::ScanV: return 47; + case Keyboard::ScanW: return 17; + case Keyboard::ScanX: return 45; + case Keyboard::ScanY: return 21; + case Keyboard::ScanZ: return 44; + + case Keyboard::ScanNum1: return 2; + case Keyboard::ScanNum2: return 3; + case Keyboard::ScanNum3: return 4; + case Keyboard::ScanNum4: return 5; + case Keyboard::ScanNum5: return 6; + case Keyboard::ScanNum6: return 7; + case Keyboard::ScanNum7: return 8; + case Keyboard::ScanNum8: return 9; + case Keyboard::ScanNum9: return 10; + case Keyboard::ScanNum0: return 11; + + case Keyboard::ScanEnter: return 28; + case Keyboard::ScanEscape: return 1; + case Keyboard::ScanBackspace: return 14; + case Keyboard::ScanTab: return 15; + case Keyboard::ScanSpace: return 57; + case Keyboard::ScanHyphen: return 12; + case Keyboard::ScanEquals: return 13; + case Keyboard::ScanLBracket: return 26; + case Keyboard::ScanRBracket: return 27; + case Keyboard::ScanBackslash: return 43; + case Keyboard::ScanDash: return 41; + case Keyboard::ScanSemicolon: return 39; + case Keyboard::ScanQuote: return 40; + //case Keyboard::ScanGraveAccent: return ? ? ? + case Keyboard::ScanComma: return 51; + case Keyboard::ScanPeriod: return 52; + case Keyboard::ScanSlash: return 53; + + case Keyboard::ScanF1: return 59; + case Keyboard::ScanF2: return 60; + case Keyboard::ScanF3: return 61; + case Keyboard::ScanF4: return 62; + case Keyboard::ScanF5: return 63; + case Keyboard::ScanF6: return 64; + case Keyboard::ScanF7: return 65; + case Keyboard::ScanF8: return 66; + case Keyboard::ScanF9: return 67; + case Keyboard::ScanF10: return 68; + case Keyboard::ScanF11: return MAKELONG(87, KF_EXTENDED); + case Keyboard::ScanF12: return MAKELONG(88, KF_EXTENDED); + //case Keyboard::ScanF13: return ??? + //case Keyboard::ScanF14: return ??? + //case Keyboard::ScanF15: return ??? + + case Keyboard::ScanCapsLock: return 58; + case Keyboard::ScanPrintScreen: return 55; + case Keyboard::ScanScrollLock: return 70; + //case Keyboard::ScanPause: return ???; + case Keyboard::ScanInsert: return 82; + case Keyboard::ScanHome: return 71; + case Keyboard::ScanPageUp: return 73; + case Keyboard::ScanDelete: return 83; + case Keyboard::ScanEnd: return 79; + case Keyboard::ScanPageDown: return 81; + case Keyboard::ScanRight: return 77; + case Keyboard::ScanLeft: return 75; + case Keyboard::ScanDown: return 80; + case Keyboard::ScanUp: return 72; + case Keyboard::ScanNumLock: return 69; + case Keyboard::ScanDivide: return 53; + //case Keyboard::ScanMultiply: return ??? ; + case Keyboard::ScanMinus: return 74; + case Keyboard::ScanPlus: return 78; + //case Keyboard::ScanPadEquals: return ???; + case Keyboard::ScanNumpadEnter: return MAKELONG(28, KF_EXTENDED); + case Keyboard::ScanDecimal: return MAKELONG(83, KF_EXTENDED); + + // Num pad keys except 5 have the extended bit (0x100) set + case Keyboard::ScanNumpad1: return MAKELONG(79, KF_EXTENDED); + case Keyboard::ScanNumpad2: return MAKELONG(80, KF_EXTENDED); + case Keyboard::ScanNumpad3: return MAKELONG(81, KF_EXTENDED); + case Keyboard::ScanNumpad4: return MAKELONG(75, KF_EXTENDED); + case Keyboard::ScanNumpad5: return 76; + case Keyboard::ScanNumpad6: return MAKELONG(77, KF_EXTENDED); + case Keyboard::ScanNumpad7: return MAKELONG(71, KF_EXTENDED); + case Keyboard::ScanNumpad8: return MAKELONG(72, KF_EXTENDED); + case Keyboard::ScanNumpad9: return MAKELONG(73, KF_EXTENDED); + case Keyboard::ScanNumpad0: return MAKELONG(82, KF_EXTENDED); + + //case Keyboard::ScanReverseSolidus: return ? ? ? ; + //case Keyboard::ScanApplication: return ? ? ? ; + //case Keyboard::ScanExecute: return ? ? ? ; + //case Keyboard::ScanHelp: return ? ? ? ; + //case Keyboard::ScanMenu: return ? ? ? ; + //case Keyboard::ScanSelect: return ? ? ? ; + //case Keyboard::ScanStop: return ? ? ? ; + //case Keyboard::ScanAgain: return ? ? ? ; + //case Keyboard::ScanUndo: return ? ? ? ; + //case Keyboard::ScanCut: return ? ? ? ; + //case Keyboard::ScanCopy: return ? ? ? ; + //case Keyboard::ScanPaste: return ? ? ? ; + //case Keyboard::ScanFind: return ? ? ? ; + //case Keyboard::ScanMute: return ? ? ? ; + //case Keyboard::ScanVolumeUp: return ? ? ? ; + //case Keyboard::ScanVolumeDown: return ? ? ? ; + case Keyboard::ScanLControl: return 29; + case Keyboard::ScanLShift: return 42; + case Keyboard::ScanLAlt: return 56; + //case Keyboard::ScanLSystem: return ? ? ? ; + case Keyboard::ScanRControl: return MAKELONG(29 ,KF_EXTENDED); + case Keyboard::ScanRShift: return 54; + case Keyboard::ScanRAlt: return 56; + //case Keyboard::ScanRSystem: return ? ? ? ; + + default: return 0; // Not sure what to return here? + } +} + } // namespace priv } // namespace sf diff --git a/src/SFML/Window/Win32/InputImpl.hpp b/src/SFML/Window/Win32/InputImpl.hpp index b145f38f..ba8f5b13 100644 --- a/src/SFML/Window/Win32/InputImpl.hpp +++ b/src/SFML/Window/Win32/InputImpl.hpp @@ -31,6 +31,7 @@ #include #include +#include namespace sf { @@ -69,7 +70,7 @@ public: static Keyboard::Scancode unlocalize(Keyboard::Key key); //////////////////////////////////////////////////////////// - /// \copydoc sf::Keyboard::localizedRepresentation + /// \copydoc sf::Keyboard::getDescription /// //////////////////////////////////////////////////////////// static String getDescription(Keyboard::Scancode code); @@ -176,6 +177,10 @@ public: /// //////////////////////////////////////////////////////////// static Vector2i getTouchPosition(unsigned int finger, const WindowBase& relativeTo); + + private: + + static LONG sfScanToWin(Keyboard::Scancode code); }; } // namespace priv diff --git a/src/SFML/Window/Win32/WindowImplWin32.cpp b/src/SFML/Window/Win32/WindowImplWin32.cpp old mode 100755 new mode 100644 index e9d1c18b..e6b63496 --- a/src/SFML/Window/Win32/WindowImplWin32.cpp +++ b/src/SFML/Window/Win32/WindowImplWin32.cpp @@ -557,6 +557,104 @@ void WindowImplWin32::grabCursor(bool grabbed) } } +//////////////////////////////////////////////////////////// +Keyboard::Scancode WindowImplWin32::toScancode(LPARAM flags) +{ + int code = ((flags & (0xFF << 16)) >> 16); + + // Windows scan codes + // Reference: https://msdn.microsoft.com/en-us/library/aa299374(v=vs.60).aspx + switch (code) + { + case 1: return Keyboard::ScanEscape; + case 2: return Keyboard::ScanNum1; + case 3: return Keyboard::ScanNum2; + case 4: return Keyboard::ScanNum3; + case 5: return Keyboard::ScanNum4; + case 6: return Keyboard::ScanNum5; + case 7: return Keyboard::ScanNum6; + case 8: return Keyboard::ScanNum7; + case 9: return Keyboard::ScanNum8; + case 10: return Keyboard::ScanNum9; + case 11: return Keyboard::ScanNum0; + case 12: return Keyboard::ScanHyphen; + case 13: return Keyboard::ScanEquals; + case 14: return Keyboard::ScanBackspace; + case 15: return Keyboard::ScanTab; + case 16: return Keyboard::ScanQ; + case 17: return Keyboard::ScanW; + case 18: return Keyboard::ScanE; + case 19: return Keyboard::ScanR; + case 20: return Keyboard::ScanT; + case 21: return Keyboard::ScanY; + case 22: return Keyboard::ScanU; + case 23: return Keyboard::ScanI; + case 24: return Keyboard::ScanO; + case 25: return Keyboard::ScanP; + case 26: return Keyboard::ScanLBracket; + case 27: return Keyboard::ScanRBracket; + case 28: return (HIWORD(flags) & KF_EXTENDED) ? Keyboard::ScanEnter : Keyboard::ScanReturn; + case 29: return (HIWORD(flags) & KF_EXTENDED) ? Keyboard::ScanRControl : Keyboard::ScanLControl; + case 30: return Keyboard::ScanA; + case 31: return Keyboard::ScanS; + case 32: return Keyboard::ScanD; + case 33: return Keyboard::ScanF; + case 34: return Keyboard::ScanG; + case 35: return Keyboard::ScanH; + case 36: return Keyboard::ScanJ; + case 37: return Keyboard::ScanK; + case 38: return Keyboard::ScanL; + case 39: return Keyboard::ScanSemicolon; + case 40: return Keyboard::ScanQuote; + case 41: return Keyboard::ScanBackslash; + case 42: return Keyboard::ScanLShift; + case 43: return Keyboard::ScanDash; + case 44: return Keyboard::ScanZ; + case 45: return Keyboard::ScanX; + case 46: return Keyboard::ScanC; + case 47: return Keyboard::ScanV; + case 48: return Keyboard::ScanB; + case 49: return Keyboard::ScanN; + case 50: return Keyboard::ScanM; + case 51: return Keyboard::ScanComma; + case 52: return Keyboard::ScanPeriod; + case 53: return (HIWORD(flags) & KF_EXTENDED) ? Keyboard::ScanDivide : Keyboard::ScanForwardSlash; + case 54: return Keyboard::ScanRShift; + case 55: return Keyboard::ScanPrintScreen; + case 56: return (HIWORD(flags) & KF_EXTENDED) ? Keyboard::ScanRAlt : Keyboard::ScanLAlt; + case 57: return Keyboard::ScanSpace; + case 58: return Keyboard::ScanCapsLock; + case 59: return Keyboard::ScanF1; + case 60: return Keyboard::ScanF2; + case 61: return Keyboard::ScanF3; + case 62: return Keyboard::ScanF4; + case 63: return Keyboard::ScanF5; + case 64: return Keyboard::ScanF6; + case 65: return Keyboard::ScanF7; + case 66: return Keyboard::ScanF8; + case 67: return Keyboard::ScanF9; + case 68: return Keyboard::ScanF10; + case 87: return (HIWORD(flags) & KF_EXTENDED) ? Keyboard::ScanUnknown : Keyboard::ScanF11; + case 88: return (HIWORD(flags) & KF_EXTENDED) ? Keyboard::ScanUnknown : Keyboard::ScanF12; + case 69: return Keyboard::ScanNumLock; + case 70: return Keyboard::ScanScrollLock; + case 71: return (HIWORD(flags) & KF_EXTENDED) ? Keyboard::ScanHome : Keyboard::ScanNumpad7; + case 72: return (HIWORD(flags) & KF_EXTENDED) ? Keyboard::ScanUp : Keyboard::ScanNumpad8; + case 73: return (HIWORD(flags) & KF_EXTENDED) ? Keyboard::ScanPageUp : Keyboard::ScanNumpad9; + case 74: return Keyboard::ScanMinus; + case 75: return (HIWORD(flags) & KF_EXTENDED) ? Keyboard::ScanLeft : Keyboard::ScanNumpad4; + case 76: return Keyboard::ScanNumpad5; + case 77: return (HIWORD(flags) & KF_EXTENDED) ? Keyboard::ScanRight : Keyboard::ScanNumpad6; + case 78: return Keyboard::ScanPlus; + case 79: return (HIWORD(flags) & KF_EXTENDED) ? Keyboard::ScanEnd : Keyboard::ScanNumpad1; + case 80: return (HIWORD(flags) & KF_EXTENDED) ? Keyboard::ScanDown : Keyboard::ScanNumpad2; + case 81: return (HIWORD(flags) & KF_EXTENDED) ? Keyboard::ScanPageDown : Keyboard::ScanNumpad3; + case 82: return (HIWORD(flags) & KF_EXTENDED) ? Keyboard::ScanInsert : Keyboard::ScanNumpad0; + case 83: return (HIWORD(flags) & KF_EXTENDED) ? Keyboard::ScanDecimal : Keyboard::ScanNumpad4; + + default: return Keyboard::ScanUnknown; + } +} //////////////////////////////////////////////////////////// void WindowImplWin32::processEvent(UINT message, WPARAM wParam, LPARAM lParam) @@ -726,12 +824,13 @@ void WindowImplWin32::processEvent(UINT message, WPARAM wParam, LPARAM lParam) if (m_keyRepeatEnabled || ((HIWORD(lParam) & KF_REPEAT) == 0)) { Event event; - event.type = Event::KeyPressed; - event.key.alt = HIWORD(GetKeyState(VK_MENU)) != 0; - event.key.control = HIWORD(GetKeyState(VK_CONTROL)) != 0; - event.key.shift = HIWORD(GetKeyState(VK_SHIFT)) != 0; - event.key.system = HIWORD(GetKeyState(VK_LWIN)) || HIWORD(GetKeyState(VK_RWIN)); - event.key.code = virtualKeyCodeToSF(wParam, lParam); + event.type = Event::KeyPressed; + event.key.alt = HIWORD(GetKeyState(VK_MENU)) != 0; + event.key.control = HIWORD(GetKeyState(VK_CONTROL)) != 0; + event.key.shift = HIWORD(GetKeyState(VK_SHIFT)) != 0; + event.key.system = HIWORD(GetKeyState(VK_LWIN)) || HIWORD(GetKeyState(VK_RWIN)); + event.key.scancode = toScancode(lParam); + event.key.code = virtualKeyCodeToSF(wParam, lParam, event.key.scancode); pushEvent(event); } break; @@ -742,12 +841,13 @@ void WindowImplWin32::processEvent(UINT message, WPARAM wParam, LPARAM lParam) case WM_SYSKEYUP: { Event event; - event.type = Event::KeyReleased; - event.key.alt = HIWORD(GetKeyState(VK_MENU)) != 0; - event.key.control = HIWORD(GetKeyState(VK_CONTROL)) != 0; - event.key.shift = HIWORD(GetKeyState(VK_SHIFT)) != 0; - event.key.system = HIWORD(GetKeyState(VK_LWIN)) || HIWORD(GetKeyState(VK_RWIN)); - event.key.code = virtualKeyCodeToSF(wParam, lParam); + event.type = Event::KeyReleased; + event.key.alt = HIWORD(GetKeyState(VK_MENU)) != 0; + event.key.control = HIWORD(GetKeyState(VK_CONTROL)) != 0; + event.key.shift = HIWORD(GetKeyState(VK_SHIFT)) != 0; + event.key.system = HIWORD(GetKeyState(VK_LWIN)) || HIWORD(GetKeyState(VK_RWIN)); + event.key.scancode = toScancode(lParam); + event.key.code = virtualKeyCodeToSF(wParam, lParam, event.key.scancode); pushEvent(event); break; } @@ -998,7 +1098,7 @@ void WindowImplWin32::processEvent(UINT message, WPARAM wParam, LPARAM lParam) //////////////////////////////////////////////////////////// -Keyboard::Key WindowImplWin32::virtualKeyCodeToSF(WPARAM key, LPARAM flags) +Keyboard::Key WindowImplWin32::virtualKeyCodeToSF(WPARAM key, LPARAM flags, Keyboard::Scancode code) { switch (key) { @@ -1006,8 +1106,7 @@ Keyboard::Key WindowImplWin32::virtualKeyCodeToSF(WPARAM key, LPARAM flags) case VK_SHIFT: { static UINT lShift = MapVirtualKeyW(VK_LSHIFT, MAPVK_VK_TO_VSC); - UINT scancode = static_cast((flags & (0xFF << 16)) >> 16); - return scancode == lShift ? Keyboard::LShift : Keyboard::RShift; + return code == lShift ? Keyboard::LShift : Keyboard::RShift; } // Check the "extended" flag to distinguish between left and right alt diff --git a/src/SFML/Window/Win32/WindowImplWin32.hpp b/src/SFML/Window/Win32/WindowImplWin32.hpp index ba2f662d..a43488b4 100755 --- a/src/SFML/Window/Win32/WindowImplWin32.hpp +++ b/src/SFML/Window/Win32/WindowImplWin32.hpp @@ -254,7 +254,17 @@ private: /// \return SFML key code corresponding to the key /// //////////////////////////////////////////////////////////// - static Keyboard::Key virtualKeyCodeToSF(WPARAM key, LPARAM flags); + static Keyboard::Key virtualKeyCodeToSF(WPARAM key, LPARAM flags, Keyboard::Scancode code); + + //////////////////////////////////////////////////////////// + /// \brief Convert win32 message flags to scancode + /// + /// \param lParam The message flags + /// + /// \return The scancode corresponding to the key + /// + //////////////////////////////////////////////////////////// + static Keyboard::Scancode convertToScancode(LPARAM flags); //////////////////////////////////////////////////////////// /// \brief Function called whenever one of our windows receives a message @@ -269,6 +279,16 @@ private: //////////////////////////////////////////////////////////// static LRESULT CALLBACK globalOnEvent(HWND handle, UINT message, WPARAM wParam, LPARAM lParam); + //////////////////////////////////////////////////////////// + /// \brief Convert a Win32 scancode to an sfml scancode + /// + /// \param flags input flags + /// + /// \return SFML scancode corresponding to the key + /// + //////////////////////////////////////////////////////////// + static Keyboard::Scancode toScancode(LPARAM flags); + //////////////////////////////////////////////////////////// // Member data ////////////////////////////////////////////////////////////