@@ -1998,6 +1998,38 @@ Key DisplayServerWindows::keyboard_get_keycode_from_physical(Key p_keycode) cons
19981998 return (Key)(KeyMappingWindows::get_keysym (vk) | modifiers);
19991999}
20002000
2001+ Key DisplayServerWindows::keyboard_get_label_from_physical (Key p_keycode) const {
2002+ Key modifiers = p_keycode & KeyModifierMask::MODIFIER_MASK ;
2003+ Key keycode_no_mod = (Key)(p_keycode & KeyModifierMask::CODE_MASK );
2004+
2005+ if (keycode_no_mod == Key::PRINT ||
2006+ keycode_no_mod == Key::KP_ADD ||
2007+ keycode_no_mod == Key::KP_5 ||
2008+ (keycode_no_mod >= Key::KEY_0 && keycode_no_mod <= Key::KEY_9 )) {
2009+ return p_keycode;
2010+ }
2011+
2012+ unsigned int scancode = KeyMappingWindows::get_scancode (keycode_no_mod);
2013+ if (scancode == 0 ) {
2014+ return p_keycode;
2015+ }
2016+
2017+ Key keycode = KeyMappingWindows::get_keysym (MapVirtualKey (scancode, MAPVK_VSC_TO_VK ));
2018+
2019+ HKL current_layout = GetKeyboardLayout (0 );
2020+ static BYTE keyboard_state[256 ];
2021+ memset (keyboard_state, 0 , 256 );
2022+ wchar_t chars[256 ] = {};
2023+ UINT extended_code = MapVirtualKey (scancode, MAPVK_VSC_TO_VK_EX );
2024+ if (ToUnicodeEx (extended_code, scancode, keyboard_state, chars, 255 , 4 , current_layout) > 0 ) {
2025+ String keysym = String::utf16 ((char16_t *)chars, 255 );
2026+ if (!keysym.is_empty ()) {
2027+ return fix_key_label (keysym[0 ], keycode) | modifiers;
2028+ }
2029+ }
2030+ return p_keycode;
2031+ }
2032+
20012033String _get_full_layout_name_from_registry (HKL p_layout) {
20022034 String id = " SYSTEM\\ CurrentControlSet\\ Control\\ Keyboard Layouts\\ " + String::num_int64 ((int64_t )p_layout, 16 , false ).lpad (8 , " 0" );
20032035 String ret;
0 commit comments