Как определить виртуальный код клавиши для 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?
Или только самому писать какой то велосипед?

21 Авг 2019 в 06:22
207 +1
0
Ответы
1

Если вы хотите получить символ, соответствующий клавише на клавиатуре в зависимости от раскладки, вам нужно использовать 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());
}

Надеюсь, это поможет вам получить текст для клавиши в зависимости от раскладки клавиатуры.

20 Апр в 13:19
Не можешь разобраться в этой теме?
Обратись за помощью к экспертам
Название заказа не должно быть пустым
Введите email
Бесплатные доработки
Гарантированные бесплатные доработки
Быстрое выполнение
Быстрое выполнение от 2 часов
Проверка работы
Проверка работы на плагиат
Интересные статьи из справочника
Поможем написать учебную работу
Название заказа не должно быть пустым
Введите email
Доверьте свою работу экспертам
Разместите заказ
Наша система отправит ваш заказ на оценку 84 622 авторам
Первые отклики появятся уже в течение 10 минут
Прямой эфир