Как определить виртуальный код клавиши для 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
236 +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 Апр 2024 в 13:19
Не можешь разобраться в этой теме?
Обратись за помощью к экспертам
Гарантированные бесплатные доработки в течение 1 года
Быстрое выполнение от 2 часов
Проверка работы на плагиат
Поможем написать учебную работу
Прямой эфир