Как определить виртуальный код клавиши для ru раскладки? Всем привет! Вот так получаю любую нажатую клавишу на клавиатуре:private void OnKeyPressed(object sender, GlobalKeyboardHookEventArgs e) { KeysConverter kc = new KeysConverter(); if (e.KeyboardState == GlobalKeyboardHook.KeyboardState.KeyDown) { GrabbedKeys += kc.ConvertToString(e.KeyboardData.VirtualCode); return; } if (e.KeyboardData.VirtualCode != GlobalKeyboardHook.VkSnapshot) return; } и класс для работы с вин32class GlobalKeyboardHookEventArgs : HandledEventArgs { public GlobalKeyboardHook.KeyboardState KeyboardState { get; private set; } public GlobalKeyboardHook.LowLevelKeyboardInputEvent KeyboardData { get; private set; } public GlobalKeyboardHookEventArgs( GlobalKeyboardHook.LowLevelKeyboardInputEvent keyboardData, GlobalKeyboardHook.KeyboardState keyboardState) { KeyboardData = keyboardData; KeyboardState = keyboardState; } } //Based on https://gist.github.com/Stasonix class GlobalKeyboardHook : IDisposable { public event EventHandler KeyboardPressed; public GlobalKeyboardHook() { _windowsHookHandle = IntPtr.Zero; _user32LibraryHandle = IntPtr.Zero; _hookProc = LowLevelKeyboardProc; // we must keep alive _hookProc, because GC is not aware about SetWindowsHookEx behaviour. _user32LibraryHandle = LoadLibrary("User32"); if (_user32LibraryHandle == IntPtr.Zero) { int errorCode = Marshal.GetLastWin32Error(); throw new Win32Exception(errorCode, $"Failed to load library 'User32.dll'. Error {errorCode}: {new Win32Exception(Marshal.GetLastWin32Error()).Message}."); } ............. при любой раскладке, если я нажимаю на 's', это и фиксируется, а есть ли стандартный способ вывести клавишу в зависимости от раскладки, например нажал я 'ы' в ру раскладке и получил 'ы' а не s? Или только самому писать какой то велосипед?
Если вы хотите получить символ, соответствующий клавише на клавиатуре в зависимости от раскладки, вам нужно использовать TextServicesFramework (TSF) для этого. TSF предоставляет возможность получить текст для клавиши, а не просто ее виртуальный код.
Вы можете использовать библиотеку Unmanaged IME Sample для работы с TSF. Вот пример кода, который показывает, как получить текст для клавиши:
using Microsoft.TSF.Core; private void OnKeyPressed(object sender, GlobalKeyboardHookEventArgs e) { KeysConverter kc = new KeysConverter(); if (e.KeyboardState == GlobalKeyboardHook.KeyboardState.KeyDown) { string text = GetTextForVirtualKey(e.KeyboardData.VirtualCode); GrabbedKeys += text; return; } if (e.KeyboardData.VirtualCode != GlobalKeyboardHook.VkSnapshot) return; } private string GetTextForVirtualKey(int virtualKeyCode) { TextServicesFramework tsf = new TextServicesFramework(); uint vKey = (uint)virtualKeyCode; ushort[] chars = new ushort[2]; tsf.GetCharsFromVirtualKey(0, vKey, 0, out chars); return new string(chars.Select(c => (char)c).ToArray()); }
Надеюсь, это поможет вам получить текст для клавиши в зависимости от раскладки клавиатуры.
Если вы хотите получить символ, соответствующий клавише на клавиатуре в зависимости от раскладки, вам нужно использовать TextServicesFramework (TSF) для этого. TSF предоставляет возможность получить текст для клавиши, а не просто ее виртуальный код.
Вы можете использовать библиотеку Unmanaged IME Sample для работы с TSF. Вот пример кода, который показывает, как получить текст для клавиши:
using Microsoft.TSF.Core;private void OnKeyPressed(object sender, GlobalKeyboardHookEventArgs e)
{
KeysConverter kc = new KeysConverter();
if (e.KeyboardState == GlobalKeyboardHook.KeyboardState.KeyDown)
{
string text = GetTextForVirtualKey(e.KeyboardData.VirtualCode);
GrabbedKeys += text;
return;
}
if (e.KeyboardData.VirtualCode != GlobalKeyboardHook.VkSnapshot)
return;
}
private string GetTextForVirtualKey(int virtualKeyCode)
{
TextServicesFramework tsf = new TextServicesFramework();
uint vKey = (uint)virtualKeyCode;
ushort[] chars = new ushort[2];
tsf.GetCharsFromVirtualKey(0, vKey, 0, out chars);
return new string(chars.Select(c => (char)c).ToArray());
}
Надеюсь, это поможет вам получить текст для клавиши в зависимости от раскладки клавиатуры.