LifeAct
@LifeAct
Создаем и раскручиваем, не ставим на конвейер

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


и класс для работы с вин32
class 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<GlobalKeyboardHookEventArgs> 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?

Или только самому писать какой то велосипед?
  • Вопрос задан
  • 82 просмотра
Пригласить эксперта
Ответы на вопрос 1
  • mindtester
    @mindtester
    а зачем так сложно?
    почему не достаточно базовый эвентов клавиатуры? там код клавиши это код, а символ возвращается в соответствии с выбранной раскладкой..

    может надо сначала уложить в голове что код клавиши всегда один и тот же? и это не символ

    коды есть у всех клавишь абсолютно. они называются сканкоды клавиатуры. они есть у модификаторов (альт, контрол, шифт) и "локеров" (капс, нум, скрол), стрелок, энтера... но код энтера отнюдь не совпадет c "\n" или 0xAD

    как по вашему работают драйверы? они получают сканкоды нажатия и отжатия, и уже сами отслеживают статусы локкеров, модификаторов, и лишь потом принимают решение конкретном символе или комбинации типа 0xAD

    после этого пересмотрите свою задачу - если она действительно требует дублирования работы драйвера, то вам и думать придется как "драйверу", но возможно по проще - статусы модификаторов и локкеров, а так же раскладки, за вас уже учли.. но вод именно код клавиши всегда останется кодом.. если нужен символ - может проще перехватывать то событие, которое вам символ и сообщит?
    Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через TM ID
Похожие вопросы