public bool TryGetCharFromKeyboardState(KeyCode virtualKeyCode, int scanCode, ToUnicodeExFlags fuState, KeyboardLayout Layout, out string?chars) { chars = default; var Keyboard = KeyboardState.Current(); var isDead = false; if (Keyboard[KeyCode.LShift].IsDown() || Keyboard[KeyCode.RShift].IsDown()) { Keyboard[KeyCode.Shift] |= KeyboardKeyState.KeyDown; } if (Keyboard[KeyCode.CapsLock].IsToggled()) { Keyboard[KeyCode.CapsLock] |= KeyboardKeyState.Toggled; } //var ConversionStatus = ToUnicodeEx((KeyCode)virtualKeyCode, scanCode, currentKeyboardState, pwszBuff, pwszBuff.Capacity, fuState, Layout.Handle); var ConversionStatus = ToUnicodeEx(Layout, Keyboard, fuState, virtualKeyCode, scanCode, out var Characters); switch (ConversionStatus) { case ToUnicodeExStatus.DeadKey: isDead = true; ClearKeyboardBuffer(virtualKeyCode, scanCode, Layout); break; case ToUnicodeExStatus.NoTranslation: break; case ToUnicodeExStatus.Success: chars = Characters; break; } if (lastVirtualKeyCode == 0 || !lastIsDead) { lastScanCode = scanCode; lastVirtualKeyCode = virtualKeyCode; lastIsDead = isDead; lastKeyState = Keyboard.Clone(); } else if (chars is {})
/// <summary> /// Translates a virtual key to its character equivalent using the current keyboard layout /// </summary> /// <param name="virtualKeyCode"></param> /// <param name="scanCode"></param> /// <param name="fuState"></param> /// <param name="chars"></param> /// <returns></returns> public bool TryGetCharFromKeyboardState(KeyCode virtualKeyCode, int scanCode, ToUnicodeExFlags fuState, out string?chars) { var Layout = KeyboardLayout.Current(); //get the active keyboard layout return(TryGetCharFromKeyboardState(virtualKeyCode, scanCode, fuState, Layout, out chars)); }